Я адаптировал инструкции на Используйте соединитель 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 - я не могу использовать его для просмотра из представлений.