【问题标题】: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 的错误版本

标签: apache-spark dataframe


【解决方案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 在所有情况下都能按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    相关资源
    最近更新 更多