使用 Dataprep 仅写入日期分区表中的日期分区

Posted

技术标签:

【中文标题】使用 Dataprep 仅写入日期分区表中的日期分区【英文标题】:Using Dataprep to write to just a date partition in a date partitioned table 【发布时间】:2018-08-23 15:54:49 【问题描述】:

我正在使用 BigQuery 视图从 BigQuery 表中获取昨天的数据,然后尝试使用 Dataprep 写入日期分区表。

我的第一个问题是 Dataprep 无法正确提取 DATE 类型的列,但将它们转换为 TIMESTAMP 可以(感谢 Elliot)。

但是,在使用 Dataprep 并设置输出 BigQuery 表时,您只有 3 个选项:AppendTruncateDrop 现有表。如果表是日期分区的并且您使用Truncate,它将删除所有现有数据,而不仅仅是该分区中的数据。

还有其他我应该使用的方法吗?我的替代方法是使用 Dataprep 覆盖表,然后使用 Cloud Composer 运行一些 SQL 将这些数据推送到日期分区表中。理想情况下,我想只使用 Dataprep 来做到这一点,但现在这似乎不可能。

BigQuery 表架构:

分区详情:

我正在摄取的数据很简单。在一个流程中:

+------------+--------+
|    date    |  name  |
+------------+--------+
| 2018-08-08 | Josh1  |
| 2018-08-08 | Josh2  |
+------------+--------+

在另一个流程中:

+------------+--------+
|    date    |  name  |
+------------+--------+
| 2018-08-09 | Josh1  |
| 2018-08-09 | Josh2  |
+------------|--------+

在这两种情况下都会覆盖数据。

【问题讨论】:

从BigQuery Data Type Conversions,您可以使用Dataprep 的“日期时间(时间戳)”类型写入BigQuery 表中的TIMESTAMP,对吗?不过,我认为没有办法使用DATE 感谢@ElliottBrossard 提供的信息。我已经设法使用TIMESTAMP 让它工作,但又出现了另一个问题。编辑了问题。某处是否有功能请求线程? 您可以向Cloud Dataprep issue tanker提交功能请求。 我也有同样的问题!你在 DataPrep 中做到了吗? 嗨华章:无法选择分区。目标表文本框不可编辑,您必须从 GUI 中选择它。理想情况下,我想安排这个数据准备作业,以便它导入最新日期的数据而不是硬编码分区。我相信这可能是 Dataprep 的错误用例。 @MT467,我最终只是用 SQL 编写查询并使用 Composer 进行调度 【参考方案1】:

您可以创建一个分区的table bases on DATE。写入分区表的数据会自动传送到相应的分区。

写入分区表的数据会根据分区列中的日期值(以 UTC 表示)自动传送到适当的分区。

追加数据以将新数据添加到分区中。

您可以使用 bq 命令创建表:

bq mk --table --expiration [INTEGER1] --schema [SCHEMA] --time_partitioning_field date 

time_partitioning_field 定义了您将用于分区的字段。

【讨论】:

如何使用 Dataprep 写入该分区? 写入分区表的数据会自动传送到相应的分区 您只需将数据发送到分区表,而无需“指定”分区。 有没有办法用 Dataprep 截断那个分区?据我所知,您只能截断整个表,而不仅仅是那个特定的分区 我明白了,你想一天多次覆盖一个分区中的数据,如果我错了,请纠正我。如果是这种情况,您可以将数据加载到临时表中,您可以使用分区装饰器将数据加载到 WRITE_TRUNCATE cloud.google.com/bigquery/docs/…

以上是关于使用 Dataprep 仅写入日期分区表中的日期分区的主要内容,如果未能解决你的问题,请参考以下文章

BigqueryIO 无法写入日期分区表

使用 apache beam 中的 beam.io.gcp.bigquery.WriteToBigQuery 模块写入日期分区的 Bigquery 表

按最新日期过滤 BigQuery 行的最有效方法

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

按日期范围分区 PostgreSQL 扫描所有分区

Redshift Spectrum 使用两个日期字段对表进行分区