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

时间:2018-08-17 14:45:12

标签: google-bigquery google-cloud-storage

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

我们现在处理蜂巢的方法是生成ddl,然后通过rest调用执行它。

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

....
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 个答案:

答案 0 :(得分:1)

  1. 尽管可以使用特殊的_FILE_NAME pseudo-column来过滤掉不想读取的文件,但是不能在GCS上的文件上创建分区表。
  2. 如果可以的话,宁愿只将数据加载到BigQuery中,也不要将其保留在GCS上。 Loading data is free,并且查询将比在GCS上的Avro文件上运行查询更快。 BigQuery在内部使用了columnar format called Capacitor,这是针对BigQuery进行了大幅优化的方法,而Avro是基于行的格式,效果也不佳。
  3. 在架构演变方面,如果需要更改列类型,删除列等,则应重新创建表(CREATE OR REPLACE TABLE ...)。如果仅添加列,则可以使用API​​或UI添加新列。

另请参阅relevant blog post about lazy data loading