首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >气流GCSToBigQueryOperator正在重新排序我的列

问气流GCSToBigQueryOperator正在重新排序我的列
EN

Stack Overflow用户
提问于 2022-07-07 18:14:20
回答 1查看 295关注 0票数 0

我的DAG中有以下操作员。他们从我的MySQL数据库接收数据,将其上传到GCS,然后导入到BigQuery。它运行得很好!有一个小问题..。

我可以看到,在create和import任务之间,目标表是使用schema参数中指定的模式以正确的列顺序在BigQuery中创建的。但是,一旦import任务运行,表的模式就会发生变化,并且将列重新排序为看似任意的排序。为什么会发生这种情况,是否有办法让BigQuery停止这样做?我看到操作符上有schema_update_options,但是文档很差.

代码语言:javascript
复制
            create=BigQueryCreateEmptyTableOperator(
                task_id="create",
                bigquery_conn_id='google_cloud',
                project_id="<myproject>",
                dataset_id=target_dataset,
                table_id=table_name,
                schema_fields=schema
            )
            upload=MySQLToGCSOperator(
                task_id='mysql_to_gcs', 
                mysql_conn_id='bi_mysql',
                sql=self.sql,
                bucket=self.bucket,
                filename=self.filename,
                export_format='NEWLINE_DELIMITED_JSON',
                google_cloud_storage_conn_id='google_cloud'
            )
            import=GCSToBigQueryOperator(
                task_id='gcs_to_bigquery',
                bucket=self.bucket,
                source_format='NEWLINE_DELIMITED_JSON',
                source_objects=[self.filename],
                destination_project_dataset_table="<myproject>..target_dataset.{table_name}",
                write_disposition='WRITE_TRUNCATE',
                bigquery_conn_id='google_cloud',
                google_cloud_storage_conn_id='google_cloud',
            )
            
            create >> upload >> import
EN

回答 1

Stack Overflow用户

发布于 2022-07-08 02:55:15

重新排序的发生是因为您没有在您的schema_fields中定义GCSToBigQueryOperator,并且它触发了BigQuery模式自动检测,其中

BigQuery尽最大努力从源数据中自动推断架构。

在您的情况下,为了确保按您希望的方式定义列的顺序,您必须在您的schema_fields中定义GCSToBigQueryOperator。

您可以省略BigQueryCreateEmptyTableOperator,因为GCSToBigQueryOperator已经可以创建BigQuery表并定义模式。

请参阅根据您发布的问题更新的代码:

代码语言:javascript
复制
upload=MySQLToGCSOperator(
                task_id='mysql_to_gcs', 
                mysql_conn_id='bi_mysql',
                sql=self.sql,
                bucket=self.bucket,
                filename=self.filename,
                export_format='NEWLINE_DELIMITED_JSON',
                google_cloud_storage_conn_id='google_cloud'
            )
            create_and_import=GCSToBigQueryOperator(
                task_id='gcs_to_bigquery',
                bucket=self.bucket,
                source_format='NEWLINE_DELIMITED_JSON',
                source_objects=[self.filename],
                destination_project_dataset_table="<myproject>..target_dataset.{table_name}",
                write_disposition='WRITE_TRUNCATE',
                bigquery_conn_id='google_cloud',
                google_cloud_storage_conn_id='google_cloud',
                schema_fields=schema
            )
            
            upload >> create_and_import

有关更多细节,您可以参考此GCSToBigQueryOperator文档。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72902493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档