Python 3.x 为加载作业指定的空架构-加载CSV

Python 3.x 为加载作业指定的空架构-加载CSV,python-3.x,google-bigquery,google-cloud-storage,airflow,Python 3.x,Google Bigquery,Google Cloud Storage,Airflow,我正试图通过GoogleCloudStorageToBigQueryOperator任务将一个CSV文件从Google云存储加载到一个空的Google大查询表中 t8 = GoogleCloudStorageToBigQueryOperator( task_id='gcs_send_dim_report', bucket='report', source_objects=[ 'gs://report/test-dim-report/dim_report_{

我正试图通过GoogleCloudStorageToBigQueryOperator任务将一个CSV文件从Google云存储加载到一个空的Google大查询表中

t8 = GoogleCloudStorageToBigQueryOperator(
    task_id='gcs_send_dim_report',
    bucket='report',
    source_objects=[
        'gs://report/test-dim-report/dim_report_{{ ds_nodash }}.csv'
    ],
    schema_fields=['filename_pdf','filename_png', 'week_date', 'code'],
    skip_leading_rows=1,
    source_format = 'CSV',
    create_disposition='CREATE_IF_NEEDED',
    write_disposition='WRITE_TRUNCATE',
    destination_project_dataset_table='xxxx-yyyy:report.test_dim_report_{{ ds_nodash }}',
    dag=dag
)
要加载的表已经在大查询中定义了模式,尽管如此,为了面对这个错误,我在使用的CSV列中添加了参数
schema\u fields
。查看任务日志,我首先遇到以下依赖项错误:

from google.appengine.api import memcache
[2018-06-22 05:58:49,650] {base_task_runner.py:98} INFO - Subtask: ImportError: No module named 'google.appengine'
[2018-06-22 05:58:49,650] {base_task_runner.py:98} INFO - Subtask: 
[2018-06-22 05:58:49,651] {base_task_runner.py:98} INFO - Subtask: During handling of the above exception, another exception occurred:
[2018-06-22 05:58:49,651] {base_task_runner.py:98} INFO - Subtask: 
[2018-06-22 05:58:49,651] {base_task_runner.py:98} INFO - Subtask: Traceback (most recent call last):
[2018-06-22 05:58:49,652] {base_task_runner.py:98} INFO - Subtask:   File "/usr/local/lib/python3.5/dist-packages/googleapiclient/discovery_cache/file_cache.py", line 33, in <module>
[2018-06-22 05:58:49,652] {base_task_runner.py:98} INFO - Subtask:     from oauth2client.contrib.locked_file import LockedFile
[2018-06-22 05:58:49,652] {base_task_runner.py:98} INFO - Subtask: ImportError: No module named 'oauth2client.contrib.locked_file'

我正在寻找解决这个错误的方法,以便成功地将我的CSV文件加载到Google Big Query中,有两种方法可以实现这一点。这都来自代码文档,也是初始位:

用于BigQuery表的架构可以在以下一种方式中指定: 两种方式。您可以直接将架构字段传入,也可以 将操作员指向Google云存储对象名称。中的对象 谷歌云存储必须是一个JSON文件,其中包含模式字段

  • 正确定义
    schema_字段
    ,如
    GoogleCloudStorageToBigQueryOperator
    文档所示。可以在此处找到如何定义架构的示例:
如果已设置,则此处定义的架构字段列表: 当源\u格式为“数据存储\u备份”时不应设置

示例(来自示例链接):

  • 设置
    schema\u对象
如果设置,则为指向.json文件的GCS对象路径,该文件 包含表的架构。(模板化)


正如dboshardy所指出的,tobi6提供的答案会导致以下错误:

错误-类型为“SchemaField”的对象不可JSON序列化

错误提示,SchemaField不是一个JSON可序列化类,而参数schema_fields需要一个JSON可序列化对象

解决方案是根据以下文档,将模式作为字典列表传递:

示例(基于OP问题):


提供的解决方案已通过Google Cloud Composer(airflow v1.10.6)针对类似问题成功测试。

您注意到的
schema\u字段
选项不起作用。它给出了这个错误<代码>错误-类型为“SchemaField”的对象不可JSON序列化此外,您指定的
schema_对象
选项也不完全以这种方式工作。似乎源文件和
schema\u对象
文件都必须在您指定的
bucket
中,此外,当您引用这些对象时,它们必须是相对于bucket的,而不是完整的
gs://
URI。@dboshardy如果对您不起作用,我建议问一个新问题。由于没有关于如何使用GCS或任何示例代码的进一步信息,因此无法帮助您。
Exception: BigQuery job failed. Final error was: {'reason': 'invalid', 'message': 'Empty schema specified for the load job. Please specify a schema that describes the data being loaded.'}.
schema = [
    bigquery.SchemaField('full_name', 'STRING', mode='REQUIRED'),
    bigquery.SchemaField('age', 'INTEGER', mode='REQUIRED'),
]
schema = [
    {"name": "filename_pdf", "type": "STRING", "mode": "REQUIRED"},
    {"name": "filename_png", "type": "STRING", "mode": "REQUIRED"},
    {"name": "week_date", "type": "DATE", "mode": "REQUIRED"},
    {"name": "code", "type": "INTEGER", "mode": "NULLABLE"}
]