Как инвертировать или дополнить вывод функции, возвращающей логическое значение в Java - PullRequest
0 голосов
/ 29 января 2020

Я пишу код искры в java и мне нужно разбить набор данных на 2 части. основанный на некотором условии.

FilterFunction<Row> cond = (Row row) -> {
return true;
}

Dataset<Row> part1 = originalDs.filter(cond ); //This part is easy
Dataset<Row> part2 = originalDs.filter(!cond ); //This part is my problem . Doesn't work

Теперь, очевидно, я могу написать другую функцию фильтра, которая возвращает false, но внутренний лог c сложен, и я не хочу переписывать те же логы c и хочу использовать одну и ту же функцию фильтра.

Есть ли способ в java, где я могу обернуть эту функцию и получить несколько дополнений?

Ответы [ 2 ]

1 голос
/ 30 января 2020

Вы можете использовать за исключением функции , подобной этой.

Dataset<Row> part1 = originalDs.filter(cond);
Dataset<Row> part2 = originalDs.except(part1);

Здесь есть один улов - except также выполняет distinct, что может быть полезно (или, по крайней мере, безвредно). ) в некоторых случаях, но не в других.

0 голосов
/ 04 февраля 2020
Dataset<Row> part1 = originalDs.filter(cond);
Dataset<Row> part2 = originalDs.join(part1, "uniqColOrPrimarykey", "leftanti");

except не будет работать, если вам потребуется изменить схему part1. но левое анти-объединение работает всегда.

Левое анти-объединение в основном сохраняет строки слева, которых нет справа, поэтому по праву называется anti

...