我需要循环遍历Spark数据帧的所有行,并使用每行中的值作为函数的输入。
基本上,我希望这种情况发生:
问题是,我无法使用[RegularExpressionAttribute(@"^[a-Z]+$", ErrorMessage = "Special characters not allowed")]
,因为数据框太大了。
我很确定我必须使用collect()
来执行我想要的操作,并尝试这样做:
map()
但是如何指定要从DataFrame中检索的信息?像Row(0),Row(1)和Row(2)这样的东西?
如何将这些值“提供”给我的功能?
答案 0 :(得分:2)
"环接"不是你真正想要的,而是一个"投射"。例如,如果您的数据框有2个int和string类型的字段,那么您的代码将如下所示:
val myFunction = (i:Int,s:String) => ??? // do something with the variables
df.rdd.map(row => myFunction(row.getAs[Int]("field1"), row.getAs[String]("field2")))
或模式匹配:
df.rdd.map{case Row(field1:Int, field2:String) => myFunction(field1,field2)}
请注意,在Spark 2中,您可以直接在数据框架上使用map
并获取新的数据框(在火花1.6 map
中会产生RDD
代替。)
请注意,您可以使用"用户自定义函数"而不是在map
中使用RDD
。数据帧API中的(UDF)