根据另一个数据帧的行查询Spark Dataframe

时间:2018-06-15 12:16:53

标签: apache-spark dataframe apache-spark-sql user-defined-functions

我需要找到一种方法来过滤spark中的数据帧,并从另一个数据帧中获取信息。

基本上我想做这样的事情:

      import sqlContext.implicits._

val df = Seq((10, 200), (30, 400)).toDF("A", "B")

val df2 = Seq((40, 200), (30, 700)).toDF("C", "D")


    def method1 = udf((P1:Int, P2:Int)=>{
       df2.filter($"C">=P1).filter($"C"<=P2 ).agg(min("D"), max("D")).head().getInt(1)
    })

    df.withColumn("max",method1($"A",$"B")).show()

我首先使用df中的A列和B列作为df2过滤器的限制。然后我获得一列经过滤的df2的最大值,并将其作为列添加到df。

代码提供以下输出:

+---+---+---+
|  A|  B|max|
+---+---+---+
| 10|200|700|
| 30|400|700|
+---+---+---+

这很有效。但是,如果我尝试使用与通过读取CSV或过滤表创建的数据帧完全相同的代码,则会出现以下错误:

org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 621.0 failed 4 times, most recent failure: Lost task 0.3 in stage 621.0 (TID 51544, node20.edp.hadoop, executor 410): java.lang.NullPointerException

这里发生了什么?数据帧之间有什么区别?有更好的方法吗?

0 个答案:

没有答案