Объединение строк в Apache Beam - PullRequest
0 голосов
/ 05 июня 2018

Мне трудно понять, могут ли объединения в Apache Beam (например, http://www.waitingforcode.com/apache-beam/joins-apache-beam/read) объединять целые строки.

Например:

У меня есть 2 набора данных в CSVФормат, в котором первые строки являются заголовками столбцов.

Первый:

a,b,c,d
1,2,3,4
5,6,7,8
1,2,5,4

Второй:

c,d,e,f
3,4,9,10

Я хочу соединиться слева на столбцах c и dтак что я получаю:

a,b,c,d,e,f
1,2,3,4,9,10
5,6,7,8,,
1,2,5,4,,

Однако вся документация по Apache Beam, похоже, говорит, что объекты PCollection должны быть типа KV<K, V> при объединении, поэтому я разбил свои объекты PCollection наколлекция KV<String, String> объектов (где ключом является заголовок столбца, а значением является значение строки). Но в этом случае (когда у вас просто есть ключ со значением), я не вижу, как можно поддерживать формат строкиОткуда KV (c, 7) «узнает», что KV (a, 5) относится к одному ряду?

Join предназначено для такого рода вещей вообще? *1022*

Мой коддо сих пор:

PCollection<KV<String, String>> flightOutput = ...;
PCollection<KV<String, String>> arrivalWeatherDataForJoin = ...;
PCollection<KV<String, KV<String, String>>> output = Join.leftOuterJoin(flightOutput, arrivalWeatherDataForJoin, "");

1 Ответ

0 голосов
/ 06 июня 2018

Да, Join - это служебный класс, который помогает с такими объединениями, как ваш.Это обертка вокруг CoGropByKey, см. соответствующий раздел в документации.Реализация этого довольно короткая .Его тесты также могут иметь полезные примеры.

Проблема в вашем случае, вероятно, вызвана тем, как вы выбираете ключи.

KeyT int KV<KeyT,V1>в библиотеке Join представляет ключ, который вы используете для сопоставления записей, она содержит все поля объединения.Так что в вашем случае вам, вероятно, потребуется назначить ключи примерно так (псевдокод):

pCollection1:

    Key     Value
   (3,4)  (1,2,3,4)
   (7,8)  (5,6,7,8)
   (5,4)  (1,2,5,4)

pCollection2:

    Key     Value
   (3,4)  (3,4,9,10)

И то, что произойдет при объединении, будет выглядеть примерно так (псевдокод):

joinResultPCollection:

   Key              Value
  (3,4)      (1,2,3,4),(3,4,9,10)
  (7,8)      (5,6,7,8),nullValue
  (5,4)      (1,2,5,4),nullValue

Таким образом, вам, вероятно, потребуется добавить еще одно преобразование после объединения, чтобы фактически объединить левую и правую стороны в объединенную строку.

Поскольку у вас есть CSV, вы, вероятно, могли бы использовать в качестве ключей фактические строки, такие как "3,4"(и ценности).Или вы можете использовать Lists<> или ваши собственные типы строк.

Например, это именно то, что Реализация Beam SQL Join делает.

...