有没有办法使用 java 驱动程序为大查询创建基于非摄取时间的分区表?

Posted

技术标签:

【中文标题】有没有办法使用 java 驱动程序为大查询创建基于非摄取时间的分区表?【英文标题】:Is there a way to create non-ingestion time based partition tables for big query with the java driver? 【发布时间】:2019-07-10 21:50:03 【问题描述】:

我一直在环顾四周,甚至使用了最新的大查询 java 驱动程序:

<dependency>
    <groupId>com.google.cloud</groupId>
    <artifactId>google-cloud-bigquery</artifactId>
    <version>1.81.0</version>
</dependency>

它似乎只提供了基于加载/摄取时间进行分区的选项。

TimePartitioning.of(Type.DAY);

我应该使用另一个选项或类来根据特定的 DATE 或 TIMESTAMP 列进行分区吗?或者这只是 java 驱动程序不支持?

【问题讨论】:

您是否尝试过执行CREATE TABLE 语句? cloud.google.com/bigquery/docs/reference/standard-sql/… 我知道我可以通过 UI 来完成,但希望它可以在 java 中使用,以便我们可以将它与我们现有的工作流集成。也就是说,通过 bigquery API 使用 create table 语句可能是一种方便的解决方法。将不得不深入研究它。 :) 谢谢! 【参考方案1】:

Java 似乎不可能,但 Python and Go 客户端库、DDL 语句、UI 等可能。

【讨论】:

【参考方案2】:

是的,根据客户端文档it is supported。

这是一个例子:

BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

String my_field = "my_field";
Schema schema = Schema.of(Field.of(my_field, LegacySQLTypeName.TIMESTAMP));

// Here is where we set the field we want to be used for the partition
TimePartitioning timePartitioning = TimePartitioning.newBuilder(TimePartitioning.Type.DAY)
                                                      .setField(my_field)
                                                      .build();

TableDefinition tableDef = StandardTableDefinition.newBuilder()
                                          .setSchema(schema)
                                          .setTimePartitioning(timePartitioning)
                                          .build();

TableInfo tableInfo = TableInfo.newBuilder(TableId.of("dataset", "table"), tableDef).build();

Table table = bigquery.create(tableInfo);

【讨论】:

以上是关于有没有办法使用 java 驱动程序为大查询创建基于非摄取时间的分区表?的主要内容,如果未能解决你的问题,请参考以下文章

从未为大数据创建的 Hadoop 减少输出文件

将一年中的一天和一年中的日期转换为大查询

有没有办法在基于正则表达式的 LOKI 查询中使用推断值?

java访问mysql数据库,为啥总是没有办法引入mysql的驱动包?

有没有办法创建字典列表 来自查询结果?

centos下为大硬盘分区(大于2T)