【问题标题】:Apache Spark - 'LeftAnti' join Ambiguous column errorApache Spark - 'LeftAnti' 加入不明确的列错误
【发布时间】:2019-06-06 13:37:33
【问题描述】:

我正在尝试在 spark 2.4 中执行 leftanti 加入,但我遇到了错误。

Dataset<Row> df = spark.read()
            .option("mode", "DROPMALFORMED")
            .schema(schema)
            .csv("/some/path/cars.csv");

Dataset<Row> Audis = df.filter(col("Make").equalTo("Audi"));
Dataset<Row> BMWs = df.filter(col("Make").equalTo("BMW"));
Audis.join(BMWs, "Make").show();

df.as("df").join(Audis.as("audi"), col("Make"), "leftanti")
           .show();

第一次加入工作正常,但对于 leftanti 我得到以下错误:

org.apache.spark.sql.AnalysisException: Reference 'Make' is ambiguous, could be: df.Make, audi.Make.;

为什么会模棱两可?它应该知道在这种连接中哪个列应该检查“IS NOT NULL”。

其他示例在 Scala 中通过提供列表达式来展示这一点,但这在 Java 中似乎是不可能的,因为没有方法签名支持像“df.Make == Audi.Make”这样的表达式字符串

// No method exists for such a signature
df.as("df").join(Audis.as("audi"), "df.Make == audi.Make", "leftanti")

到目前为止,我看到的所有此类连接的示例都不是 Java,有人可以解释为什么会发生此错误以及什么是有效示例吗?

【问题讨论】:

    标签: java apache-spark apache-spark-sql


    【解决方案1】:

    与一些同事协商并一起度过几个小时。您需要使用 col("MyColumn").equalTo(col("OtherColumn"))。

    这个例子有效:

    df.as("df").join(Audis.as("audi"), col("df.Make").equalTo(col("audi.Make")), "leftanti")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-30
      • 1970-01-01
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多