我正在读取 2 个不同的.csv文件,其中只有以下列:
val dF1 = sqlContext.read.csv("some.csv").select($"ID")
val dF2 = sqlContext.read.csv("other.csv").select($"PID")
尝试搜索 dF2("PID") 是否存在于 dF1("ID"):
val getIdUdf = udf((x:String)=>{dF1.collect().map(_(0)).toList.contains(x)})
val dfFinal = dF2.withColumn("hasId", getIdUdf($"PID"))
这给了我空指针异常。但是如果我在外面转换 dF1 并在 udf 中使用列表,它可以工作:
val dF1 = sqlContext.read.csv("some.csv").select($"ID").collect().map(_(0)).toList
val getIdUdf = udf((x:String)=>{dF1.contains(x)})
val dfFinal = dF2.withColumn("hasId", getIdUdf($"PID"))
我知道我可以使用 join 来完成此操作,但想知道这里空指针异常的原因是什么。
谢谢。
请检查有关在另一个数据帧的转换中访问数据帧的问题。这正是您正在使用UDF所做的,这在Spark中是不可能的。解决方案是使用加入,或者在转换和广播之外收集。