Написание разных значений для разных таблиц BigQuery в Apache Beam

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

Как это сделать, используя API-интерфейс Apache Beam BigQueryIO ?

    Это возможно с помощью функции, недавно добавленной в BigQueryIO в Apache Beam.

     PCollection foos = ...; foos.apply(BigQueryIO.write().to(new SerializableFunction, TableDestination>() { @Override public TableDestination apply(ValueInSingleWindow value) { Foo foo = value.getValue(); // Also available: value.getWindow(), getTimestamp(), getPane() String tableSpec = ...; String tableDescription = ...; return new TableDestination(tableSpec, tableDescription); } }).withFormatFunction(new SerializableFunction() { @Override public TableRow apply(Foo foo) { return ...; } }).withSchema(...)); 

    В зависимости от того, является ли входной PCollection ограниченным или неограниченным, под капотом это либо создаст несколько заданий импорта BigQuery (один или несколько за каждую таблицу в зависимости от объема данных), либо будет использовать API вставки streamовых вложений BigQuery.

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

    Кроме того, BigQueryIO был реорганизован в ряд преобразований многократного использования, которые вы можете объединить для реализации более сложных вариантов использования – см. Файлы в исходном каталоге .

    Эта функция будет включена в первую стабильную версию Apache Beam и в следующую версию Dataflow SDK (которая будет основана на первом стабильном выпуске Apache Beam). Прямо сейчас вы можете использовать это, запустив свой конвейер против моментального снимка Beam at HEAD из github.

    Давайте будем гением компьютера.