Я хочу выполнить левое внешнее соединение с набором данных, используя искровой Java API. Как написать динамическое условие для соответствия нескольким столбцам в условии соединения.
У меня есть два объекта набора данных. Оба из них имеют 2 или более столбцов. Я не могу определить состояние
Пример, который сопоставляет 1 столбец с другим
dataSet = resultData.as("resultData").join(distinctData.as("distinctData"), resultData.col("A").equalTo(distinctData.col("B")), "leftouter").selectExpr(select.toString());
Теперь, поскольку существует несколько столбцов, я не могу определить динамическое выражение для сопоставления нескольких столбцов с использованием Java API.
Отредактировал вопрос
вы получаете ошибку? что происходит, когда вы запускаете код выше?
например, упомянутый в вопросе, я не получаю никаких ошибок. Проблема в том, что я хочу указать условие для сопоставления нескольких столбцов, и я не могу найти ссылку, чтобы определить то же самое.




Непроверенный код, но он динамически генерирует условие соединения из списка имен столбцов.
public Column makeJoinConditional(Dataset<Row> df1, Dataset<Row> df2, List<String> columnNames, Column c) {
if (c==null) {
String top = columnNames.get(0);
columnNames.remove(0);
Column first = df1.col(top).equalTo(df2.col(top));
return makeJoinConditional(df1,df2, columnNames,first);
} else {
if (columnNames.size()==0) {
return c;
} else {
String top = columnNames.get(0);
columnNames.remove(0);
Column next = c.and( df1.col(top).equalTo(df2.col(top)) );
return makeJoinConditional(df1,df2, columnNames,next);
}
}
}
public Dataset<Row> joinDataFrames(Dataset<Row> df1, Dataset<Row> df2, List<String> columns) {
Column joinCols = makeJoinConditional(df1,df2,columns,null);
return df1.join(df2,joinCols);
}
Да, это будет работать, когда у меня фиксированное количество столбцов. Но номер столбца зависит от каждого сценария, и я не могу каждый раз менять код для этого :)
Итак, вам нужна функция, которая по списку столбцов может генерировать условный оператор?
Да, несколько похоже на то, что вы сказали. Но dataste.join() принимает столбец, columnExpr и seq. Я пытаюсь найти, что такое columnExpr, который вернет условный столбец/оператор.
хорошо, обновленный ответ для динамического создания условного выражения на основе списка имен столбцов
вы, вероятно, получили отрицательный голос, потому что вы не включили ничего о том, как выглядят ваши данные, или о том, что вы пробовали до сих пор. Я был бы рад помочь вам, если бы вы могли предоставить эту информацию.