Коллекция для нескольких таблиц - PullRequest
0 голосов
/ 19 мая 2018

У меня есть две большие таблицы запросов.

Таблица A

c_id    count_c_id  p_id

Таблица B

id   c_name   p_type  c_id 

Основываясь на столбцах таблицы A, мне нужно найти детали из таблицы B с использованием конвейеров DF.

PCollection<TableRow> tableRowBQ = pipeline.apply(BigQueryIO.Read
.named("Read").fromQuery("select c_id,count_c_id,p_id from TableA"));

Мое требование основано на возврате c_id по этому запросу. Я должен быть в состоянии получить c_name из TableB, используя pcollection.Я не могу найти ни одного примера pcollection для итерации поля из одной таблицы и извлечь данные из другой таблицы, используя это поле.

Пример, предоставленный Google Team в качестве ссылки.https://github.com/GoogleCloudPlatform/DataflowSDK-examples/blob/master-1.x/src/main/java/com/google/cloud/dataflow/examples/cookbook/JoinExamples.java.

1 Ответ

0 голосов
/ 22 мая 2018

Из документации Cloud DataFlow , я думаю, у вас есть два подхода для выполнения задачи такого рода JOIN .В зависимости от того, сколько у вас уникальных c_id, я бы выбрал один из двух вариантов ниже:

  • , если у вас не много c_id с, я бы обработал результат от вашегоSELECT запрос в качестве побочного ввода и использование его в качестве фильтра для перехода к поиску в таблице B;

Вот фрагмент кода для использования результата запроса BigQueryIO в качестве побочного ввода: ApplyБоковой ввод для операции BigQueryIO.read в Apache Beam .

  • В противном случае вы можете использовать CoGroupByKey.Например,
Table A:
c_id -> count_c_id, p_id

Table B
c_id -> c_name

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

c_id -> ([count_c_id, p_id], [c_name]]

тогда вы можете делать все, что вы хотите, на этой «сгруппированной» новой PCollection.

...