【问题标题】:How to define BigQuery schema using Standard SQL?如何使用标准 SQL 定义 BigQuery 架构?
【发布时间】:2017-03-13 22:31:10
【问题描述】:

我想在一个新项目中使用 BigQuery 标准 SQL,但是我找不到任何关于如何定义架构的示例,所有内容都指向 Legacy SQL。特别是,我想使用ARRAYSTRUCT

【问题讨论】:

    标签: python schema google-bigquery


    【解决方案1】:

    在 BigQuery 中创建表的一种方法是使用 API 调用。没有 CREATE 表语法。

    创建表格

    BigQuery 提供了多种创建新表的方法as detailed here

    • 您可以使用命令行工具的 bq mk 命令或 BigQuery API tables.insert() 方法创建一个空表。
    • 您可以从 CSV 或 JSON 数据文件(压缩或未压缩)、Avro 文件或 Cloud Datastore 备份加载表。
    • 您可以根据查询结果创建表。
    • 您可以复制表格
    • 您可以在 Cloud Storage 中的文件上定义表
    • 您可以在定义表架构时使用标准 SQL 类型(请参阅 Elliotts 答案),并且文档中也有一个要更新的问题。投票/starhere.

    很多Python samples are on GitHub简单如下:

    def create_table(dataset_name, table_name, project=None):
        """Creates a simple table in the given dataset.
        If no project is specified, then the currently active project is used.
        """
        bigquery_client = bigquery.Client(project=project)
        dataset = bigquery_client.dataset(dataset_name)
    
        if not dataset.exists():
            print('Dataset {} does not exist.'.format(dataset_name))
            return
    
        table = dataset.table(table_name)
    
        # Set the table schema
        table.schema = (
            bigquery.SchemaField('Name', 'STRING'),
            bigquery.SchemaField('Age', 'INTEGER'),
            bigquery.SchemaField('Weight', 'FLOAT'),
        )
    
        table.create()
    
        print('Created table {} in dataset {}.'.format(table_name, dataset_name))
    

    【讨论】:

    • 感谢您提供更多指点,但此示例不包括使用 STRUCTARRAY 类型。我检查了the implementation of bigquery.SchemaField,文档显然是关于旧版 SQL 的。
    • 你有点糊涂了。所以 SQL 只用于查询而不是定义表。当您创建表时,您需要使用那里列出的类型,它既不是传统 SQL 也不是标准 SQL,它是字段类型的 API 定义。当您定义表时,您可以继续使用 JSON 中列出的类型,并且在编写标准 SQL 查询时,您可以简单地将 RECORD 或 REPEATED 定义的字段类型用作 Struct 或 Array。
    • 好的,谢谢!这是有道理的,但是我认为应该更具体地记录它。作为一个新用户,我已经知道两种不同的语言版本就足够了。
    • 你可以在每个谷歌页面上提交反馈,使用那些
    【解决方案2】:

    您可以使用使用标准 SQL 类型的架构创建表。下面是一个有效模式的示例:

    {
      "a": "ARRAY<STRUCT<x INT64, y STRING>>",
      "b": "STRUCT<z DATE>",
      "c": "INT64"
    }
    

    如果你把它放在一个文件中,比如sample_schema.json,你可以使用bq mk从它创建一个表:

    bq mk --schema sample_schema.json -t your_dataset.YourTableName
    

    bq 客户端之外,tables.insert API 还支持标准 SQL 类型名称。

    【讨论】:

    • 这是一个未记录的功能吗?它根本不会通过库中实现的任何 JSON 验证。
    • 我的意思是引用INT64;这就是你所指的吗?除此之外,这些值只是字符串。
    • 是的,但这是否记录在某处?
    • 好像没有。我提交了issuetracker.google.com/issues/36168576
    • 啊,有趣!顶级键(abc)在这里是什么意思?
    猜你喜欢
    • 2016-11-23
    • 2018-09-10
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多