Левое внешнее соединение сбрасывает строки в Pentaho DI

У меня есть два набора данных (файлы csv), которые я ввожу в преобразование Pentaho DI с помощью шага «ввод файла CSV». В файле A есть столбец joincol, значения которого отображаются в файле B в столбце joincol. Я хочу оставить соединение данных в файле A с данными в файле B при условии A.joincol = B.joincol, чтобы получить соответствующие данные из столбца wantcol из файла B.

Довольно простые вещи.

В качестве (необходимого) предварительного шага я сортирую оба набора данных по столбцам, которые нужно объединить (а именно A.joincol и B.joincol) по возрастанию.

Затем я использую шаг «Объединение слиянием» с отсортированными данными из файла A в качестве «Первого шага» и отсортированных данных из файла B в качестве «Второго шага» и выбираю «Тип соединения» как ЛЕВЫЙ ВНЕШНИЙ. Я выбираю «Получить ключевые поля» в разделе «Ключи для 1-го шага» и указываю, что joincol - единственное ключевое поле, к которому можно присоединиться, затем проделываю то же самое для «Ключи для 2-го шага».

Итак, соединение работает частично, за исключением:

  • строки удаляются, что должно быть абсолютно невозможно при левом внешнем соединении
  • отбрасываемые строки - это именно те строки, которые находятся в группе строк, соответствующих последнему значению joincol при сортировке по возрастанию.

Я подтвердил, что значения в файле A joincol все появляются в файле B joincol, выполнив vlookup в Excel. В любом случае, даже если ни одно значений не появилось в файле B, левое внешнее соединение все равно должно оставить мне по крайней мере все строки, в которые я вошел.

Я новичок в Пентахо, поэтому мне трудно поверить, что я наткнулся на такую ​​сумасшедшую ошибку так рано в моем исследовании, что означает, что я, должно быть, пропустил шаг. Однако я прочитал документацию по объединению слиянием и считаю, что выполнил все необходимые шаги (те, которые я изложил здесь). Может ли кто-нибудь сообщить мне, если я что-то пропустил? Может, это результат частой ошибки?

Спасибо большое!


person Rookatu    schedule 06.06.2017    source источник
comment
Подтвердили ли вы, что эти последние строки присутствуют и передаются на этапах ввода CSV-файла и сортировки строк? Вы можете сделать сортировку по убыванию, а затем предварительно просмотреть шаг, ваши строки должны быть первыми.   -  person Cyrus    schedule 07.06.2017
comment
Да, я не имею дела с большим количеством данных, я вручную проверял каждую строку вывода каждого шага. Они присутствовали на обоих входах соединения.   -  person Rookatu    schedule 08.06.2017
comment
Прочтите и действуйте в соответствии с минимальным воспроизводимым примером. Ваш вопрос ясен, но необходимы более подробные сведения. Также, пожалуйста, объясните, откуда вы берете шаги. (bidimensions.com/category/tutorial/?) PS Если все значения left появляется справа, тогда результат левого соединения совпадает с результатом внутреннего соединения. Так почему вы остались присоединиться?   -  person philipxy    schedule 08.06.2017


Ответы (1)


Объединения типичны для SQL, а не для PDI.

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

Если вы ищете одно значение, например «Клиент заказа», используйте шаг Lookup/Lookup Stream. Если вы ожидаете, что некоторые значения будут отсутствовать (LEFT JOIN), вы можете использовать значение по умолчанию. Если вам нужна только строка с соответствием (INNER JOIN), вы можете отфильтровать только что введенное значение по умолчанию.

Если вам нужно вернуть много строк, например все заказы клиента, вы можете Joins/Merge Join. Исходя из опыта, обычно легче перевернуть вопрос.

В случае, если вы не можете, вы находитесь в случае ПОЛНОГО ВНЕШНЕГО СОЕДИНЕНИЯ, вы должны использовать Joins/Join Rows (Cartesian Product), в котором вы можете добавить одно или несколько условий.

person AlainD    schedule 02.07.2017
comment
Привет, @AlainD, я ценю ответ. Мой процесс обычно заключается в использовании левых объединений, чтобы в случае отсутствия значения поиска я не терял данные. Для строк, в которых поиск не найден, я объединю значение столбца поиска с некоторым значением по умолчанию, а затем проверю такие строки как выбросы. Я считаю, что это стандартная практика в разработке ETL. Я просто не понимаю, ПОЧЕМУ левое соединение не работает. Есть ли у вас какие-нибудь идеи? Спасибо! - person Rookatu; 03.07.2017
comment
Привет @Rookatu, без примера сложно сказать. Я считаю, что проблема в данных во входящем потоке, а не в шаге PDI. И, скорее всего, в порядке сортировки, для которого у вас есть множество опций: с учетом регистра, локаль, подборщик и общий тип. Поэтому убедитесь, что вход CSV не находится в режиме ленивого преобразования, чтобы данные преобразовывались из внутренних двоичных байтов в правильные строки, числа, даты и т. Д. ДО того, как они войдут в этап сортировки. - person AlainD; 04.07.2017
comment
Это проблема с входными данными или файлом, который вы рассматривали с левой стороны, имеет меньше строк, чем строки в файле с правой стороны. - person karan arora; 16.10.2017