Loops 如何循环一个Spark数据帧的所有行并对每一行应用一个函数?

Loops 如何循环一个Spark数据帧的所有行并对每一行应用一个函数?,loops,apache-spark,dataframe,Loops,Apache Spark,Dataframe,我需要遍历Spark数据帧的所有行,并使用每行中的值作为函数的输入 基本上,我希望这样做: 获取数据库的行 将数据库行中的值分隔为不同的变量 使用这些变量作为我定义的函数的输入 问题是,我不能使用collect(),因为数据帧太大了 我非常确定我必须使用map()来执行我想要的操作,我已经尝试过这样做: MyDF.rdd.map(MyFunction) 但是如何指定要从数据帧检索的信息呢?类似于第(0)行、第(1)行和第(2)行的内容 如何将这些值“馈送”到函数中?“循环”不是您真正想要的,而

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

基本上,我希望这样做:

  • 获取数据库的行
  • 将数据库行中的值分隔为不同的变量
  • 使用这些变量作为我定义的函数的输入
  • 问题是,我不能使用
    collect()
    ,因为数据帧太大了

    我非常确定我必须使用
    map()
    来执行我想要的操作,我已经尝试过这样做:

    MyDF.rdd.map(MyFunction)
    
    但是如何指定要从数据帧检索的信息呢?类似于第(0)行、第(1)行和第(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
    ,并获得一个新的数据帧(在Spark 1.6中
    map
    将产生
    RDD

    请注意,除了在
    RDD
    中使用
    map
    之外,还可以在数据帧API中使用“用户定义函数”(UDF)