我需要找到一种方法来过滤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
这里发生了什么?数据帧之间有什么区别?有更好的方法吗?