Непоследовательные результаты при попытке найти записи, удаленные между 2 файлами с помощью набора данных Spark (Java) - PullRequest
0 голосов
/ 25 октября 2019

Я использую Spark Java API и пытаюсь найти записи, которые были удалены между 2 файлами с использованием набора данных. Для одного теста, который я имею, я сравниваю 2 идентичных файла, которые имеют 2 столбца. Я использую один из столбцов в качестве типа PK (если PK отсутствует в более новом файле, это удаление).

Пример файла

ID | TYPE
ABC | BUY
CDE | BUY
FGH | SELL

Наборы данных были созданы как:

Dataset<Row> previous/actual = sparkSession.read().
                       .option("inferSchema","true")
                       .option("header","true")
                       .option("delimiter","|")
                       .csv(*pathToFile*);

У меня есть противоречивые результаты для сценариев ниже

Пример 1:

Dataset<Row> deleted = previous.join(actual,previous.col("ID").equalTo(actual.col("ID")),"leftanti"); 

В результате я получаю:

|
Труба напечатана в моем выходном файле. Если я вызываю delete.show (), я получаю null | null

Пример 2 очень похож, но я вычисляю хеш для всех столбцов (для обоих наборов данных отдельно) как:

//columns has the content of previous.columns();
previous = previous.withColumn("hash", functions.hash(columns.toArray(new Column[0])));

Я заменяю идентификатор на хеш в запросе

Dataset<Row> deleted = previous.join(actual,previous.col("hash").equalTo(actual.col("hash")),"leftanti");

Но теперь мой результат, как и ожидалось, является пустым файлом. Почему результаты отличаются?

1 Ответ

0 голосов
/ 25 октября 2019

Если я понял вашу проблему, вам нужны записи из обоих наборов данных, которых нет ни в одном из наборов данных, тогда вы можете перейти к методу исключения.

То же самое относится к ссылке Spark: вычестьдва DataFrames

dataFrame1.except (dataFrame2) вернут новый DataFrame, содержащий строки в dataFrame1, но не в dataframe2. или это не результат, просто сделайте наоборот.

dataFrame2.except (dataFrame1)

...