Чтение из BigQuery и фильтрация данных, у меня есть 2 способа
Чтение из BigQuery в потоке данных (с использованием BigqueryIO.readTableRow.from (ValueProvider)) целых данных, а затем фильтрация на основе условий, таких как максимальная дата
Чтение из BigQuery в потоке данных с использованием NestedValueProvider путем выполнения запроса, который будет извлекать только требуемые данные, намного медленнее.
Так как возникнет проблема, если я прочитаю данные целиком, а моя таблица находится в режиме добавления, что увеличит время чтения данных по мере прохождения дня.
Но если я читаю только данные с конкретной датой, которые сделают время чтения моего конвейера согласованным.
Но для 200 записей поставщик вложенных значений занимает гораздо больше времени, чем чтение целых данных с помощью BigqueryIO.readTableRow.from (ValueProvider).
Что я скучаю, кто-нибудь может помочь?
Мой фрагмент ниже, пожалуйста, найдите.
Snippet:
PCollection<TableRow> targetTable = input.apply("Read TRUSTED_LAYER_TABLE_DESCRIPTION", BigQueryIO
.readTableRows()
.withoutValidation()
.withTemplateCompatibility()
.fromQuery(NestedValueProvider.of(options.get(Constants.TABLE_DESCRIPTION.toString())
, new QueryTranslator(options.get(Constants.ETL_BATCH_ID.toString())))).usingStandardSql());
Фрагмент класса поставщика вложенных значений:
public class QueryTranslator implements SerializableFunction{
/**
* Read data with max etlbatchid from query
*/
ValueProvider<String> etlbatchid;
public QueryTranslator(ValueProvider<String> etlbatchid){
this.etlbatchid = etlbatchid;
}
private static final long serialVersionUID = -2754362391392873056L;
@Override
public String apply(String input) {
String batchId = this.etlbatchid.get();
if (batchId.equals("-1"))
return String.format("SELECT * from `%s`", input);
else
return String.format("SELECT * from `%s` where etlbatchid = %s;", input,batchId);
}
}
@GrahamPolley Я снова обновил вопрос, который может вам помочь.

В зависимости от вашего варианта использования могут использоваться оба способа, и вы должны учитывать плюсы и минусы каждого из них.
Первый (чтение всей таблицы) будет очень быстрым, поскольку Dataflow может легко разделить рабочую нагрузку на несколько сегментов и обработать ее с параллелизмом, а значит, и с быстротой. Обратной стороной является то, что стоимость, вероятно, будет выше из-за интенсивной загрузки процессора.
Ожидается, что второй вариант будет медленнее из-за нескольких операций, которые BigQuery будет выполнять, но будет рентабельным. Минусы этой опции будут заключаться в том, что, вероятно, вы столкнетесь с одним или несколькими квота и лимит BigQuery, для отмены которых потребуется сложное кодирование.
Вы также можете проверить, можете ли вы реализовать эти примеры для чтение всей таблицы, использовать строковый запрос и использовать метод фильтрации (на основе этого Поток StackOverflow).
Не уверен, о чем вы спрашиваете. Вы можете попытаться уточнить?