在我的Spark 1.6应用程序中,我有一些代码来选择分区并仅查询给定的分区。我是这样做的:
val rdd = df.rdd.mapPartitionsWithIndex((idx, iter) => if (idx == 0) iter else Iterator(), true)
val newDF = sqlContext.createDataFrame(rdd, df.schema)
如果我然后在字段上调用UDF以及新的mapPartitions调用,如
newDF.withColumn("newField", myUDF(df("oldField")).mapPartitions(...)
我得到了
resolved attribute(s) oldField#36 missing from idField#51L,oldField#52 in operator !Project [idField#51L,oldField#52,UDF(oldField#36) AS newField#53];
对我而言,似乎字段“oldField”在某种程度上存在,但是 - 也许是因为我创建了一个新的DataFrame? - ID错误(比较oldField#52
和oldField#36
)。如果我打印我的旧DataFrame和newDF
的架构,两者看起来都一样。
我可以做些什么来避免这个错误(除了改变代码中的操作顺序,我不喜欢这样做,因为当前的结构对我来说似乎非常有用)?
答案 0 :(得分:2)
不要将名称绑定到不在范围内的DataFrame
。您可以使用col
function:
newDF.withColumn("newField", myUDF(col("oldField"))
newDF.withColumn("newField", myUDF($"oldField"))
或当前DataFrame
:
newDF.withColumn("newField", myUDF(newDF("oldField"))