从现有系统转换为新的“分区表”

Posted

技术标签:

【中文标题】从现有系统转换为新的“分区表”【英文标题】:Transforming to new "Partitioned Tables" from existing system 【发布时间】:2016-06-05 12:07:06 【问题描述】:

我有很多按日期分片的表。我正在探索继续前进并改用新的“分区表”的方法。 我找到了转换表的参考:https://cloud.google.com/bigquery/docs/creating-partitioned-tables#converting_dated_tables_into_a_partitioned_table

但是,由于我有许多与现有表相关的流程(加载数据或查询),我正在寻找一种分阶段的过渡方法。 含义:我想一开始就改变加载过程和表定义,然后慢慢改变所有相关的过程。

    我应该如何进行这种过渡? (由于显而易见的原因,我们已经考虑并排除了复制所有内容并维护每个流程两次的选项。) 在查询新转换表的分区时,是否可以使用旧表名约定 (MyTable_YYYYMMDD)? 在转换所有查询模板之前,是否可以使用旧的表通配符函数来查询它? 公共数据集上是否存在可供我们试验的现有分区表?

谢谢

【问题讨论】:

【参考方案1】:

这并不完全是您想要的,但可能会达到目的。使用标准 SQL,BigQuery 支持等效的表通配符函数:

此功能的文档即将推出,但总结一下:

我们提供了一个伪列 _TABLE_SUFFIX,它提供了一种寻址表的方法。例如,以下查询允许您从表 myproject.mydataset.20150105 和 myproject.mydataset.20150106 中读取(假设 value1 是两者中的一个字段)。

SELECT _TABLE_SUFFIX AS table_name, SUM(value1) 来自myproject.mydataset.* 其中 _TABLE_SUFFIX = '20150105' 或 _TABLE_SUFFIX = '20150106' 按 1 分组;

对于您的用例:

您可以首先将您的查询转换为日期分片表以使用 _TABLE_SUFFIX 伪列。然后,当您能够将这些表转换为分区表时。之后,您需要对脚本稍作改动以使用分区伪列(因为在这两种情况下伪列名称略有不同)。

【讨论】:

当你说“在那之后,你需要对你的脚本做一个小的改动来使用分区伪列......”你是指加载过程,还是我的查询? 您的示例查询如何使用包含日期前前缀的表名,例如 myproject.mydataset.mytablename_YYYYMMDD?【参考方案2】:

我的几分钱:

我可以使用旧的表通配符函数来查询它,直到我 转换我所有的查询模板?

直接针对新的分区表 - 不。你很可能会得到类似“table wildcards matches no table”的东西

有没有办法使用旧的表名约定 (MyTable_YYYYMMDD) 查询新转换的分区时 桌子?

我看到的选项是创建以new_partitioned 表命名但遵循new_partitioned_YYYYMMDD 命名的相应每日视图。 因此,在使用新的分区功能时,在进行完全迁移之前,您仍将使用旧语法。 这会带来一些额外的麻烦,因为您需要确保每天为新分区创建这些每日视图 - 但如果您正在寻找临时解决方案 - 这应该没什么大不了的。

最后快速评论一下转换表的参考:

文档中没有明确说明,但看​​起来你不能只使用bq partition 命令将现有分片转换为新分区。首先,您实际上需要创建该分区表。如果没有 - 您将获得没有架构的新表,因此它将无用。这可能是一个错误 - 不知道

【讨论】:

我有一个非分片、非分区表,如何分区? easy :o) - 1. 创建具有相同架构的分区表 2. 从原始表(按分区分区)中选择新的分区表。如果您需要更多详细信息 - 发布新问题,因为评论很难用于详细回答 公共数据集上是否存在可供我们试验的现有分区表? 我不知道。我已经创建了自己的体验/播放

以上是关于从现有系统转换为新的“分区表”的主要内容,如果未能解决你的问题,请参考以下文章

U盘装win10(我们无法创建新的分区,也找不到现有分区)

对分区表添加子分区

diskgenius软件将分区表类型转换成GUID,提示磁盘的首尾部分没有转换到GUID分区所必须的空间,还需各33个扇区,不能转换成功

win10用mbr还是guid那个好? 1t机械硬盘

硬盘分区表与mbr的关系

在 SQL Server 2017 上创建具有 800+ 百万行的现有分区表的列存储索引