Построить вложенную структуру с использованием BeamSQL
В BigQuery у нас есть функция "ARRAY_AGG", которая помогает преобразовать обычную коллекцию во вложенную коллекцию. Есть ли похожий способ создания такого же типа коллекции вложенных структур с использованием BeamSQL? Нечто вроде ниже запроса в BeamSQL,
"Выберите column1, ARRAY_AGG(STRUCT(column2, column3)) из группы PCOLLECTION по Column1"
1 ответ
Если я правильно понял ваш вопрос, вы сможете использовать ARRAY
конструктор как "SELECT ARRAY[1, 2, 3] f_arr"
, это проходит:
@Test
public void testArrayConstructor() {
BeamSqlEnv sqlEnv = BeamSqlEnv.inMemory(readOnlyTableProvider);
PCollection<Row> stream =
BeamSqlRelUtils.toPCollection(pipeline, sqlEnv.parseQuery("SELECT ARRAY[1, 2, 3] f_arr"));
PAssert.that(stream)
.containsInAnyOrder(
Row.withSchema(Schema.builder().addArrayField("f_arr", FieldType.INT32).build())
.addValue(Arrays.asList(1, 2, 3))
.build());
pipeline.run().waitUntilFinish(Duration.standardMinutes(2));
}
Смотрите также:
- Справочное руководство по Calcite SQL (это парсер, используемый Beam SQL);
- Тестирование сложных типов балок;
- Тест вложенных рядов пучка