Лучший способ читать таблицу BigQuery

Чтение из BigQuery и фильтрация данных, у меня есть 2 способа

  1. Чтение из BigQuery в потоке данных (с использованием BigqueryIO.readTableRow.from (ValueProvider)) целых данных, а затем фильтрация на основе условий, таких как максимальная дата

  2. Чтение из 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);
    }
}

Не уверен, о чем вы спрашиваете. Вы можете попытаться уточнить?

Graham Polley 10.08.2018 12:07

@GrahamPolley Я снова обновил вопрос, который может вам помочь.

BackBenChers 10.08.2018 14:00
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
0
2
675
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В зависимости от вашего варианта использования могут использоваться оба способа, и вы должны учитывать плюсы и минусы каждого из них.

Первый (чтение всей таблицы) будет очень быстрым, поскольку Dataflow может легко разделить рабочую нагрузку на несколько сегментов и обработать ее с параллелизмом, а значит, и с быстротой. Обратной стороной является то, что стоимость, вероятно, будет выше из-за интенсивной загрузки процессора.

Ожидается, что второй вариант будет медленнее из-за нескольких операций, которые BigQuery будет выполнять, но будет рентабельным. Минусы этой опции будут заключаться в том, что, вероятно, вы столкнетесь с одним или несколькими квота и лимит BigQuery, для отмены которых потребуется сложное кодирование.

Вы также можете проверить, можете ли вы реализовать эти примеры для чтение всей таблицы, использовать строковый запрос и использовать метод фильтрации (на основе этого Поток StackOverflow).

Другие вопросы по теме