我正在阅读2个不同的 .csv 文件,这些文件只有以下栏目:
val dF1 = sqlContext.read.csv("some.csv").select($"ID")
val dF2 = sqlContext.read.csv("other.csv").select($"PID")
尝试搜索dF1(“ID”)中是否存在dF2(“PID”):
val getIdUdf = udf((x:String)=>{dF1.collect().map(_(0)).toList.contains(x)})
val dfFinal = dF2.withColumn("hasId", getIdUdf($"PID"))
这给了我空指针异常。 但如果我将dF1转换为外部并在udf中使用list,则可以正常工作:
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 来完成此操作,但想知道这里是否有空指针异常的原因。
感谢。
答案 0 :(得分:3)
请查看有关accessing dataframe inside the transformation of another dataframe的问题。这正是您使用UDF所做的,而这在spark中是不可能的。解决方案是使用join,或者在转换和广播之外收集。