我有几个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
在我的&#34;真实&#34;数据?
答案 0 :(得分:0)
事实证明,map
列是罪魁祸首。我一直在使用parallelize
方法创建我的DataFrame,例如:
val df = spark.parallelize(Seq((1, Map(1 -> 2.toShort), "foo")))
如果我从这些数据中省略Map,except
方法可以正常工作,如果我尝试并行化Seq of 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
在所有情况下都按预期工作。