Apache Spark - 'LeftAnti' объединяет неоднозначную ошибку столбца - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь выполнить соединение leftanti в spark 2.4, но у меня возникают ошибки.

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 голосов
/ 06 июня 2019

Консультирование с некоторыми коллегами и проведение нескольких часов вместе.Вам нужно использовать col ("MyColumn"). EqualTo (col ("OtherColumn")).

Этот пример работает:

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