Spark:Dataframe“except”方法引发错误:“unresolved operator:'Except;”

Posted

技术标签:

【中文标题】Spark:Dataframe“except”方法引发错误:“unresolved operator:\'Except;”【英文标题】:Spark: Dataframe "except" method raises error: "unresolved operator: 'Except;"Spark:Dataframe“except”方法引发错误:“unresolved operator:'Except;” 【发布时间】:2017-09-13 18:11:33 【问题描述】:

我有几个 DataFrame 对象,称为(比如)df1df2,我试图找到 df1 中但不是 df2 中的行。 except 方法似乎正是我所需要的,但是当我调用它时,我得到一个错误:

Exception in thread "main" org.apache.spark.sql.AnalysisException: unresolved operator 'Except;

从四处搜索看来,如果 DataFrame 没有相同的结构,则可能(或曾经)引发此错误,但是当我打印出它们的文本表示时,它们看起来相同:

[user_id: int, doc_days: map<int,smallint>, updated_at: string]

我在 REPL 上进行了实验,手动创建了与它具有相同结构的 DataFrame,except 可以正常工作。

为什么except 不能处理我的“真实”数据?

【问题讨论】:

听起来像是 Spark 的错误版本 【参考方案1】:

所以事实证明是map 列是罪魁祸首。我一直在使用 parallelize 方法创建我的 DataFrame,例如:

val df = spark.parallelize(Seq((1, Map(1 -> 2.toShort), "foo")))

如果我从该数据中省略 Map,except 方法可以正常工作,如果我尝试并行化 Maps 序列,代码甚至无法编译。

我最终找到了this answer,它提出了另一种方法:

val schema = StructType(
  Seq(
    StructField("user_id", IntegerType),
    StructField("doc_days", MapType(IntegerType, ShortType)),
    StructField("updated_at", StringType)
  )
)

val df = sqlContext.createDataFrame(sparkContext.makeRDD(data), schema)

...其中data 是上面的Seq

当我这样做时,except 在所有情况下都能按预期工作。

【讨论】:

以上是关于Spark:Dataframe“except”方法引发错误:“unresolved operator:'Except;”的主要内容,如果未能解决你的问题,请参考以下文章

except() 查询的 spark sql 执行需要很多时间

Spark中将RDD转换成DataFrame的两种方法

Spark数据集何时使用Except vs Left Anti Join

Spark SQL中 RDD 转换到 DataFrame (方法二)

Spark中创建DataFrame方法总结

Spark RDD转换成DataFrame的两种方式