Spark:Dataframe"除了"方法引发错误:"未解析的运算符:'除了;"

时间:2017-09-13 18:11:34

标签: apache-spark dataframe

我有几个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在我的&#34;真实&#34;数据?

1 个答案:

答案 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在所有情况下都按预期工作。