创建按一/多列分区的 BigQuery 外部表

Posted

技术标签:

【中文标题】创建按一/多列分区的 BigQuery 外部表【英文标题】:create BigQuery external tables partitioned by one/multiple columns 【发布时间】:2018-08-17 14:45:12 【问题描述】:

我正在将 Java 应用程序从 Hadoop/Hive 移植到 Google Cloud/BigQuery。应用程序将 avro 文件写入 hdfs,然后在文件顶部创建具有一个/多个分区的 Hive 外部表。 我了解 Big Query 目前仅支持日期/时间戳分区,不支持嵌套分区。

我们现在处理 hive 的方式是生成 ddl,然后使用 rest 调用执行它。

我在 BigQuery DDL 文档中找不到对 CREATE EXTERNAL TABLE 的支持,因此我改用了 java 库。 我设法创建了一个外部表,但在传递给调用的参数中找不到对分区的任何引用。 这是我使用的代码的 sn-p:

....
ExternalTableDefinition extTableDef = 
ExternalTableDefinition.newBuilder(schemaName, null, FormatOptions.avro()).build();
TableId tableID = TableId.of(dbName, tableName);
TableInfo tableInfo = TableInfo.newBuilder(tableID, extTableDef).build();
Table table = bigQuery.create(tableInfo);   
....

但是支持非外部表的分区。

我有几个问题:

是否支持创建带有分区的外部表?你能指出我正确的方向吗 是否将数据加载到 BigQuery 中,而不是将其存储在 GS avro 文件中? 如果是,我们将如何处理模式演变?

非常感谢您

【问题讨论】:

【参考方案1】:
    您无法在 GCS 上为文件创建分区表,但您可以使用特殊的 _FILE_NAME pseudo-column 过滤掉您不想阅读的文件。 如果可以的话,最好将数据加载到 BigQuery 中,而不是将其留在 GCS 上。 Loading data is free,查询将比在 GCS 上的 Avro 文件上运行查询要快得多。 BigQuery 在内部使用 columnar format called Capacitor,它针对 BigQuery 进行了大量优化,而 Avro 是基于行的格式,性能不佳。 在架构演变方面,如果您需要更改列类型、删除列等,您应该重新创建表 (CREATE OR REPLACE TABLE ...)。如果您只添加列,则可以使用 API 或 UI 添加新列。

另请参阅relevant blog post about lazy data loading。

【讨论】:

艾略特,非常感谢您的回答!您是否计划在不久的将来使用多个列和非时间戳分区? 对于非基于时间戳/日期的分区,请关注the relevant feature request on the issue tracker。我不知道现有的按多列分区的功能请求,但您可以创建一个。 如果回答了您的问题,请将答案标记为已接受;另见***.com/help/someone-answers

以上是关于创建按一/多列分区的 BigQuery 外部表的主要内容,如果未能解决你的问题,请参考以下文章

BIgQuery AVRO 外部表架构

在 Bigquery 中查询外部表并且新数据到达时没有架构自动检测

分区 BigQuery 表,从 AVRO 加载

BigQuery 中的 Hive 分区 LAYOUT 表格式

从外部表读取与加载数据并在 Bigquery 中读取

使用路径中没有列名的分区创建 Hive 外部表?