google-bigquery - 使用 _PARTITIONTIME 从现有表在 BigQuery 中创建聚簇表
问题描述
我正在尝试创建一个新的聚集表,它与BigQuerydb.new_table
中的现有表具有相同的数据和架构。db.old_table
现有表有一个伪列_PARTITIONTIME
,我希望新表也有这个_PARTITIONTIME
伪列。
我尝试使用 DDL,查询如下:
CREATE TABLE `db.new_table`
PARTITION BY DATE(_PARTITIONTIME)
CLUSTER BY field1, field2
AS SELECT * FROM `db.old_table`
WHERE _PARTITIONTIME > '1990-01-01'
但是它失败了,因为我们不能使用PARTITION BY DATE(_PARTITIONTIME)
后跟AS SELECT ...
. 如https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language中所述
有没有办法做到这一点?(从由伪列 _PARTITIONTIME 分区的旧表中创建一个具有完全相同架构和数据的新聚簇表)
感谢您的任何回答和评论,谢谢。
注意:我可以创建一个没有 _PARTITIONTIME 的类似表,查询如下:
CREATE TABLE `db.new_table`
PARTITION BY partition_date
CLUSTER BY field1, field2
AS SELECT DATE(_PARTITIONTIME) AS partition_date, * FROM `db.old_table`
WHERE _PARTITIONTIME > '1990-01-01'
但是,由于系统中很多东西都依赖于db.old_table
,因此分区字段从_PARTITIONTIME
to的变化partition_date
会导致很多查询变化......因此,如果我们可以创建具有完全相同的模式和数据的聚簇表,那将是更可取的。
解决方案
db.new_table
您可以使用 BQ UI 或bq
命令预先创建按天分区的聚簇表(在任何字段上) 。
一旦表格在那里,您可以将“每天”填充为:
bq query --allow_large_results --append_table --noflatten_results --destination_table 'db.new_table$19900101' "select field1, field2, field3 from db.old_table where _PARTITIONTIME = '1990-01-01'";
注意两点:
- 您必须每天单独运行此查询(这将花费您几乎相同的费用,所以不用担心)。
db.new_table$19900101
指向1990-01-01
in的分区db.new_table
。
推荐阅读
- amazon-redshift - 查询用户授权时出错“关系“sql_features”不存在”
- node.js - Sequelize v5 下划线选项不起作用
- python - 如何通过使用烧瓶服务器获取脚本名称来将外部 python 脚本作为 celery 任务运行
- ios - 呈现新的 ViewController 后 Swift 关闭当前的 ViewController
- android - 将 Firebase 存储下载 URL 推送到 Firebase 云 Firestore
- javascript - 如何通过 URL 从 php 文件中接收回显数据?
- php - 运行数据库迁移时使用特定的数据库连接
- ios - 在一个 pod 下构建为模块的多个子项目
- html - 如何从表格的下拉菜单中删除先前选择的选项?
- python - 使用 render_template() 中的“for”循环在 html 中显示表格