【问题标题】:BigQuery external table operator use wrong schema pathBigQuery 外部表运算符使用错误的架构路径
【发布时间】:2020-11-05 13:10:08
【问题描述】:

这是我正在研究的 DAG 中的一个 sn-p

create_ext_table = bigquery_operator.BigQueryCreateExternalTableOperator(
    task_id='create_ext_table',
    bucket='bucket-a',
    source_objects='path/*',
    schema_object='bucket-b/data/schema.json',
    destination_project_dataset_table='sandbox.write_to_BQ',
    source_format='CSV',
    field_delimiter=';')

create_ext_table

当我运行代码时,我在 Composer 1.10.10+composer 上收到以下错误:

404 GET https://storage.googleapis.com/download/storage/v1/b/bucket-a/o/bucket-b%2Fdata%2Fschema.json?alt=media: (u'Request failed with status code', 404, u'Expected one of', 200, 206)

如错误中所见,气流将存储桶参数与 schema_objet 参数连接起来......有什么解决方法吗?因为我无法将表架构和表文件存储在同一个存储桶中

谢谢

【问题讨论】:

    标签: google-cloud-platform airflow google-cloud-composer


    【解决方案1】:

    正如您所见in the source code for the operator here,这是意料之中的,我们使用bucket 参数来获取schema_object,因此操作员假设您将它们放在同一个存储桶中。

    正如您提到的,您无法存储它们,您可以尝试一些解决方法,我将与他们进行高层交流:

    1. 您可以扩展运算符并覆盖 execute 方法,您可以在该方法中从您关心的存储桶中检索数据
    2. 您可以使用GoogleCloudStorageToGoogleCloudStorageOperator 添加上游任务以将架构对象移动到bucket-a。这需要处理 schema_object 与源代码处理它的方式不同。即解析它以获取存储桶名称和对象路径,然后检索它。或者,您可以创建自己的参数(类似于schema_bucket)并以类似的方式使用它。
      1. 您还可以在创建外部表后使用GoogleCloudStorageDeleteOperator 作为下游任务删除此对象,因此不必将其保留在`bucket中

    关于schema_object 参数的最后说明,它是GCS 路径,因为它使用相同的bucket,所以如果你使用已经定义的运算符,它应该是schema_object='data/schema.json',

    【讨论】:

    • 谢谢@Tanjin,我只有对该存储桶的读取权限,并且我想尽量减少为执行此任务而生成的 python 代码量,我将使用 BigQueryOperator 并有一些 DDL 语句就在上面
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 2019-12-02
    • 2020-04-12
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    相关资源
    最近更新 更多