Apache Spark-'LeftAnti'加入歧义列错误

时间:2019-06-06 13:37:33

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

我试图在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语言,有人可以解释为什么会发生此错误,什么是有效的示例?

1 个答案:

答案 0 :(得分:0)

与一些同事进行磋商并一起度过几个小时。您需要使用col(“ MyColumn”)。equalTo(col(“ OtherColumn”))。

此示例有效:

df.as("df").join(Audis.as("audi"), col("df.Make").equalTo(col("audi.Make")), "leftanti")
相关问题