如何遍历Spark数据帧的所有行并将函数应用于每一行?

时间:2018-02-11 19:19:03

标签: loops apache-spark dataframe

我需要循环遍历Spark数据帧的所有行,并使用每行中的值作为函数的输入。

基本上,我希望这种情况发生:

  1. 获取数据库行
  2. 将数据库行中的值分隔为不同的变量
  3. 将这些变量用作我定义的函数的输入
  4. 问题是,我无法使用[RegularExpressionAttribute(@"^[a-Z]+$", ErrorMessage = "Special characters not allowed")] ,因为数据框太大了。

    我很确定我必须使用collect()来执行我想要的操作,并尝试这样做:

    map()

    但是如何指定要从DataFrame中检索的信息?像Row(0),Row(1)和Row(2)这样的东西?

    如何将这些值“提供”给我的功能?

1 个答案:

答案 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)

相关问题