Apache Spark 1.6:查询单个分区会导致属性丢失错误

时间:2016-04-20 08:08:47

标签: scala apache-spark dataframe apache-spark-sql

在我的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#52oldField#36)。如果我打印我的旧DataFrame和newDF的架构,两者看起来都一样。

我可以做些什么来避免这个错误(除了改变代码中的操作顺序,我不喜欢这样做,因为当前的结构对我来说似乎非常有用)?

1 个答案:

答案 0 :(得分:2)

不要将名称绑定到不在范围内的DataFrame。您可以使用col function

newDF.withColumn("newField", myUDF(col("oldField"))

implicit conversions

newDF.withColumn("newField", myUDF($"oldField"))

或当前DataFrame

newDF.withColumn("newField", myUDF(newDF("oldField"))