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 对象,称为(比如)df1
和 df2
,我试图找到 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数据集何时使用Except vs Left Anti Join