Могу ли я отфильтровать данные, возвращаемые соединителем BigQuery для Spark? - PullRequest
0 голосов
/ 08 ноября 2018

Я адаптировал инструкции на Используйте соединитель BigQuery с Spark для извлечения данных из частного объекта BigQuery с помощью PySpark. Я запускаю код на Dataproc. Рассматриваемый объект - это представление с количеством элементов> 500 миллионов строк. Когда я выпускаю это заявление:

table_data = spark.sparkContext.newAPIHadoopRDD(
    'com.google.cloud.hadoop.io.bigquery.JsonTextBigQueryInputFormat',
    'org.apache.hadoop.io.LongWritable',
    'com.google.gson.JsonObject',
    conf=conf)

в выводе задания я вижу:

Bigquery connector version 0.10.7-hadoop2
Creating BigQuery from default credential.
Creating BigQuery from given credential.
Using working path: 'gs://dataproc-9e5dc592-1a35-42e6-9dd6-5f9dd9c8df87-europe-west1/hadoop/tmp/bigquery/pyspark_input20181108091647'
Estimated number of shards < desired num maps (0 < 93); clipping to 0.
Computed '2' shards for sharded BigQuery export.
Table 'projectname:datasetname.viewname' to be exported has 0 rows and 0 bytes
Estimated number of shards < desired num maps (0 < 93); clipping to 0.
Computed '2' shards for sharded BigQuery export.
Table 'projectname:datasetname.viewname' to be exported has 0 rows and 0 bytes

(отметка времени / уровень сообщения / пространство имен удалено для удобства чтения)

Это было более 2 часов назад, и задание все еще выполняется, больше не было выводов за это время. Я посмотрел в упомянутом местоположении GS и вижу, что каталог с именем shard-0 был найден, но он пуст. По существу, за последние 2 часа не было видимой активности.

Меня беспокоит, что коннектор bq пытается извлечь весь вид. Есть ли способ, которым я могу выполнить запрос, чтобы определить, какие данные для извлечения в отличие от извлечения всего представления?


UPDATE
Меня заинтриговало это сообщение в выводе:

Estimated number of shards < desired num maps (0 < 93); clipping to 0

Мне кажется странным, что предполагаемое количество осколков будет равно 0. Я посмотрел на код (ShardedExportToCloudStorage.java) , который выполняется здесь и вышеупомянутое сообщение зарегистрировано от computeNumShards(). Учитывая numShards=0 Я предполагаю, что numTableBytes=0, что означает вызов функции:

tableToExport.getNumBytes();

(ShardedExportToCloudStorage.java#L97)

возвращает 0, и я предполагаю, что причина в том, что состоит в том, что объект, к которому я обращаюсь, является представлением, а не таблицей. Я на что-то здесь или я в погоне за диким гусем?


ОБНОВЛЕНИЕ 2 ... Чтобы проверить мою теорию (выше), что исходный объект, являющийся представлением, вызывает проблему, я сделал следующее:

Создана таблица в том же проекте, что и мой кластер dataproc

create table jt_test.jttable1 (col1 string)

вставленные в него данные

insert into jt_test.jttable1 (col1) values ('foo')

Отправлено задание dataproc для чтения таблицы и вывода количества строк

Вот код:

conf = {
    # Input Parameters.
     'mapred.bq.project.id': project
    ,'mapred.bq.gcs.bucket': bucket
    ,'mapred.bq.temp.gcs.path': input_directory
    ,'mapred.bq.input.project.id': 'myproject'
    ,'mapred.bq.input.dataset.id': 'jt_test'
    ,'mapred.bq.input.table.id': jttable1
}
table_data = spark.sparkContext.newAPIHadoopRDD(
    'com.google.cloud.hadoop.io.bigquery.JsonTextBigQueryInputFormat',
    'org.apache.hadoop.io.LongWritable',
    'com.google.gson.JsonObject',
    conf=conf)
print ('got table_data')
print (table_data.toDF().head(10))
print ('row tally={}'.format(table_data.toDF().count()))

Когда я запускаю задание patproc dataproc, вот что выводится:

8/11/08 14:59:26 INFO <cut> Table 'myproject:jt_test.jttable1' to be exported has 1 rows and5 bytes
got table_data
[Row(_1=0, _2=u'{"col1":"foo"}')]
row tally=1

Создать вид на стол

create view jt_test.v_jtview1 as select col1 from `myproject.jt_test.jttable1`

Запустите ту же работу, но на этот раз используйте представление вместо таблицы

conf = {
    # Input Parameters.
     'mapred.bq.project.id': project
    ,'mapred.bq.gcs.bucket': bucket
    ,'mapred.bq.temp.gcs.path': input_directory
    ,'mapred.bq.input.project.id': 'myproject'
    ,'mapred.bq.input.dataset.id': 'jt_test'
    ,'mapred.bq.input.table.id': v_jtview1
}

Когда я запускаю задание patproc dataproc, вот что выводится:

Table 'dh-data-dev-53702:jt_test.v_jtview1' to be exported has 0 rows and 0 bytes

и все! Больше нет вывода, и задание все еще выполняется, точно так же, как я объяснил выше. Его эффективно подвешен.

Кажется, что это ограничение коннектора BigQuery - я не могу использовать его для просмотра из представлений.

1 Ответ

0 голосов
/ 08 ноября 2018

Чтобы закрыть этот цикл, jamiet @ подтвердил в комментарии, что основной причиной является то, что BigQuery не поддерживает экспорт из Views, он поддерживает экспорт только из таблиц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...