我有一组avro文件,模式稍有不同,我想加载到一个bq表中。
有没有办法用一条线做到这一点?处理模式差异的每种自动方式对我来说都没问题。
这是我到目前为止所尝试的内容。
0)如果我尝试以简单的方式进行,bq会失败并显示错误:
bq load --source_format=AVRO myproject:mydataset.logs gs://mybucket/logs/*
Waiting on bqjob_r4e484dc546c68744_0000015bcaa30f59_1 ... (4s) Current status: DONE
BigQuery error in load operation: Error processing job 'iow-rnd:bqjob_r4e484dc546c68744_0000015bcaa30f59_1': The Apache Avro library failed to read data with the follwing error: EOF reached
1)快速谷歌搜索显示有--schema_update_option = ALLOW_FIELD_ADDITION选项,添加到bq加载作业,没有任何改变。 ALLOW_FIELD_RELAXATION也不会改变任何东西。
2)实际上,文件名中提到了模式ID,因此文件如下所示:
gs://mybucket/logs/*_schemaA_*
gs://mybucket/logs/*_schemaB_*
不幸的是,bq load在星号上不允许更多(如bq手册中所述):
bq load --source_format=AVRO myproject:mydataset.logs gs://mybucket/logs/*_schemaA_*
BigQuery error in load operation: Error processing job 'iow-rnd:bqjob_r5e14bb6f3c7b6ec3_0000015bcaa641f3_1': Not found: Uris gs://otishutin-eu/imp/2016-06-27/*_schemaA_*
3)当我尝试明确列出文件时,列表恰好太长,所以bq load也不起作用:
bq load --source_format=AVRO myproject:mydataset.logs $(gsutil ls gs://mybucket/logs/*_schemaA_* | xargs | tr ' ' ',')
Too many positional args, still have ['gs://mybucket/logs/log_schemaA_2658.avro,gs://mybucket/logs/log_schemaA_2659.avro,gs://mybucket/logs/log_schemaA_2660.avro,...
4)当我尝试将文件用作外部表并在外部表定义中明确列出文件时,我也会收到“文件太多”错误:
BigQuery error in query operation: Table definition may not have more than 500 source_uris
据我所知,我可以先将文件复制到不同的文件夹,然后逐个文件夹处理它们,这就是我现在正在做的最后一招,但这只是数据处理管道的一小部分,复制不能作为生产解决方案。