如何使用API 使用存储在Google云端存储中的架构文件在BigQuery加载作业上设置架构?

问题描述 投票:1回答:2

我创建了一个python脚本来从Google Cloud Storage存储桶中获取JSON文件并将其加载到数据集中。我在尝试指定与文本文件位于同一个存储桶中的架构时遇到问题

我的架构文件是格式为Attribute:DataType,Attribute:DataType的txt文件

这就是我所拥有的

job_config = bigquery.LoadJobConfig()

schema_uri = 'gs://<bucket-name>/FlattenedProduct_schema.txt'
schema = schema_uri
job_config.schema = schema    
job_config.source_format = bigquery.SourceFormat.NEWLINE_DELIMITED_JSON
uri = 'gs://<bucket-name>/FlattenedProduct_JSON.txt'

load_job = client.load_table_from_uri(
    uri,
    dataset_ref.table('us_states'),
    location='US',  # Location must match that of the destination dataset.
    job_config=job_config)  # API request
google-cloud-platform google-bigquery google-cloud-storage
2个回答
0
投票

您需要自己阅读文本文件并将其转换为schema所需的格式,即List[google.cloud.bigquery.schema.SchemaField] – Schema of the destination table.

所需架构的示例:

from google.cloud.bigquery import SchemaField

schem = [
     SchemaField('field1','STRING'),
     SchemaField('field2', 'INTEGER'),
     SchemaField('value', 'FLOAT')
    ]

0
投票

从您给定的代码中,您从桶中调用了txt文件,但是您使用了源格式作为JSON(SourceFormat.NEWLINE_DELIMITED_JSON)。您可以查看这些行以查看它是否有效。

job_config.source_format = bigquery.SourceFormat.NEWLINE_DELIMITED_JSON
uri = 'gs://<bucket-name>/FlattenedProduct_JSON.txt'

或者作为解决方法,您还可以尝试使用以下命令来调用位于本地计算机或GCS中的JSON格式文件。以下命令在加载数据时指定架构。

bq --location=[LOCATION] load --source_format=[FORMAT] [PROJECT_ID]:[DATASET].[TABLE] [PATH_TO_DATA_FILE] [PATH_TO_SCHEMA_FILE]

哪里:

[LOCATION]是您所在位置的名称。如果您的数据位于美国或欧盟多区域位置,则 - location标志是可选的。例如,如果您在东京地区使用BigQuery,请将标志的值设置为asia-northeast1。您可以使用.bigqueryrc文件为该位置设置默认值。

[FORMAT]是NEWLINE_DELIMITED_JSON或CSV。

[PROJECT_ID]是您的项目ID。

[DATASET]是包含要加载数据的表的数据集。

[TABLE]是要加载数据的表的名称。

[PATH_TO_DATA_FILE]是本地计算机或Google云端存储中CSV或JSON数据文件的位置。

[SCHEMA_FILE]是本地计算机上架构文件的路径。

或者,您也可以在API中指定架构。

  • 要在加载数据时指定模式,请调用jobs.insert方法并配置configuration.load.schema属性。在jobReference部分的location属性中指定您的区域。
  • 要在创建表时指定模式,请调用tables.insert方法并使用schema属性在表资源中配置模式。

请单击here以查看这些选项的详细信息。

© www.soinside.com 2019 - 2024. All rights reserved.