Как написать условие динамического соединения в искровом Java API

Я хочу выполнить левое внешнее соединение с набором данных, используя искровой 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.

вы, вероятно, получили отрицательный голос, потому что вы не включили ничего о том, как выглядят ваши данные, или о том, что вы пробовали до сих пор. Я был бы рад помочь вам, если бы вы могли предоставить эту информацию.

nont 23.04.2019 15:25

Отредактировал вопрос

vvp 23.04.2019 15:33

вы получаете ошибку? что происходит, когда вы запускаете код выше?

nont 23.04.2019 16:05

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

vvp 23.04.2019 16:12
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
566
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Непроверенный код, но он динамически генерирует условие соединения из списка имен столбцов.

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);
    }

Да, это будет работать, когда у меня фиксированное количество столбцов. Но номер столбца зависит от каждого сценария, и я не могу каждый раз менять код для этого :)

vvp 23.04.2019 16:57

Итак, вам нужна функция, которая по списку столбцов может генерировать условный оператор?

nont 23.04.2019 17:24

Да, несколько похоже на то, что вы сказали. Но dataste.join() принимает столбец, columnExpr и seq. Я пытаюсь найти, что такое columnExpr, который вернет условный столбец/оператор.

vvp 23.04.2019 17:25

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

nont 23.04.2019 21:20

Другие вопросы по теме