Google bigquery 从非分区表迁移到分区表

Google bigquery 从非分区表迁移到分区表,google-bigquery,Google Bigquery,6月,BQ团队。但该指南缺少如何将旧的非分区表迁移到新样式中 我正在寻找一种方法来更新几个或如果不是所有的表到新的样式 除日间类型分区外,还有哪些其他选项可用?BQ UI是否显示了这一点,因为我无法从BQ Web UI创建这样一个新的分区表。如果您今天有日期分片表,您可以使用这种方法: 如果要将单个非分区表转换为分区表,则可以尝试运行SELECT*查询并允许大的结果,并使用表的分区作为目标,类似于重述分区数据的方式: 请注意,这种方法将向您收取查询源表的扫描成本,其次数与您查询的次数相同 在接下

6月,BQ团队。但该指南缺少如何将旧的非分区表迁移到新样式中

我正在寻找一种方法来更新几个或如果不是所有的表到新的样式


除日间类型分区外,还有哪些其他选项可用?BQ UI是否显示了这一点,因为我无法从BQ Web UI创建这样一个新的分区表。

如果您今天有日期分片表,您可以使用这种方法:

如果要将单个非分区表转换为分区表,则可以尝试运行SELECT*查询并允许大的结果,并使用表的分区作为目标,类似于重述分区数据的方式:

请注意,这种方法将向您收取查询源表的扫描成本,其次数与您查询的次数相同


在接下来的几个月里,我们正在努力使这个场景变得更好。

在BigQuery中推出新功能之前,还有另一种更便宜的方法可以使用。我们使用这种方法,而不是运行数百条SELECT*语句,这将花费我们数千美元

使用普通分区命令在BigQuery中创建分区表 创建数据流管道并使用BigQuery.IO.Read接收器读取表 使用一个分区来划分每一行 如果一次最多使用200个碎片/接收器,并且达到API限制,则为每天/碎片创建一个BigQuery.IO.Write接收器,该接收器将使用分区装饰器语法-$YYYYMMDD写入相应的分区 重复N次,直到处理完所有数据。 让你开始

您仍然需要为数据流管道付费,但这只是在BigQuery中使用多个SELECT*的成本的一小部分

从Pavan的回答中可以看出:请注意,这种方法将向您收取查询源表的扫描成本,其次数与您查询的次数相同。
来自奔腾10评论:假设我有几年的数据,我需要为每天准备不同的查询并运行所有查询,假设我有1000天的历史,我需要支付源表中完整查询价格的1000倍

正如我们所看到的,这里的主要问题是每天都进行全面扫描。剩下的问题就不那么严重了,可以在任何情况下轻松地编写脚本

所以,下面是如何划分表,同时避免每天对整个表进行扫描

下面一步一步地展示了该方法

它足够通用,可以扩展/应用于任何真实的用例——同时我正在使用bigquery-public-data.noaa_gsod.gsod2017,我将练习限制在10天内,以保持可读性

步骤1–创建透视表 在这一步中,我们 a将每行的内容压缩到记录/数组中 和 b把它们都放在各自的“每日”栏中

标准SQL 选择 数组_CONCAT_AGGCASE,当d='day20170101'时,r结束为day20170101, 数组_CONCAT_AGGCASE,当d='day20170102'时,r结束为day20170102, 数组_CONCAT_AGGCASE,当d='day20170103'时,r结束为day20170103, 数组_CONCAT_AGGCASE,当d='day20170104'时,r结束为day20170104, 数组_CONCAT_AGGCASE,当d='day20170105'时,r结束为day20170105, 数组_CONCAT_AGGCASE当d='day20170106'时,则r结束为day20170106, 数组_CONCAT_AGGCASE,当d='day20170107'时,r结束为day20170107, 数组_CONCAT_AGGCASE,当d='day20170108'时,r结束为day20170108, 数组_CONCAT_AGGCASE,当d='day20170109'时,r结束为day20170109, 数组_CONCAT_AGGCASE当d='day20170110'时,r结束为day20170110 从…起 选择d、r、按d多分区的行数作为行 从…起 选择 stn,CONCAT'day',year,mo,da作为d,ARRAY_AGGt作为r 来自“bigquery公共数据.noaa_gsod.gsod2017”作为t 按stn、d分组 分组 使用pivot_表或首选的任何名称作为目标,在Web UI中运行上述查询

正如我们所看到的——这里我们将得到10列的表——一天一列,每列的模式是原始表模式的副本:

步骤2–逐个处理分区,仅扫描相应列,不扫描完整表–插入相应分区

标准SQL 选择r* 从pivot_表中,UNNESTday20170101作为r 使用名为mytable$20160101的目标表从Web UI运行上述查询

你可以在第二天跑步

标准SQL 选择r* 从pivot_表中,UNNESTday20170102作为r 现在,您应该将目标表设置为mytable$20160102,以此类推

您应该能够使用您选择的任何客户机自动化/编写此步骤的脚本

您可以使用上述方法,这取决于您的创造力

注意:BigQuery允许表中最多有10000列,所以一年中相应天数的365列在这里绝对不是问题:o 除非有限制 ion关于你可以使用新分区的时间有多远–我听说了,但没有机会检查,现在已经不超过90天了

更新

请注意: 上面的版本有一个额外的逻辑,将所有聚合的单元格打包成尽可能少的最终行数

按d作为行的行数超额分配 然后 分组 随着 数组\u CONCAT\u AGG… 是这样吗

当原始表中的行大小不太大时,这种方法效果很好,所以最终的合并行大小仍将在BigQuery的行大小限制范围内,我相信到目前为止是10MB

如果源表的行大小已接近该限制,请使用以下调整版本

在此版本中–删除分组,使每一行只有一列的值

标准SQL 选择 当d=日期20170101时,则r结束为日期20170101, 当d=日期20170102时,r结束为日期20170102, 当d=日期20170103时,r结束为日期20170103, 当d=日期20170104时,则r结束为日期20170104, 当d=日期20170105时,则r结束为日期20170105, 当d=日期20170106时,则r结束为日期20170106, 当d=日期20170107时,则r结束为日期20170107, 当d=日期20170108时,则r结束为日期20170108, 当d='day20170109'时,则r结束为day20170109, 当d='day20170110'时,r结束为day20170110 从…起 选择 stn,CONCAT'day',year,mo,da作为d,ARRAY_AGGt作为r 来自“bigquery公共数据.noaa_gsod.gsod2017”作为t 按stn、d分组 其中,d在“day20170101”和“day20170110”之间 正如您现在所看到的,pivot表sparce_pivot_表非常稀疏,同样为21.5 MB,但现在pivot_表中的行数为114089行,而pivot_表中的行数为11584行,因此它的平均行数为190B,而初始版本中的行数为1.9KB。根据示例中的列数,这显然要少10倍。 因此,在使用这种方法之前,需要进行一些数学计算,以预测/估计可以做什么以及如何做

仍然:透视表中的每个单元格都是原始表中整行的JSON表示。它不仅像原始表中的行那样保存值,而且还包含一个模式


因此,它非常冗长-因此单元格的大小可能比原始大小大数倍[这限制了这种方法的使用…除非你变得更具创造性:o…这仍然有很多领域需要应用:o]

截至今天,现在可以通过查询非分区表并指定分区列,从非分区表创建分区表。您将支付对原始非分区表进行一次完整表扫描的费用。注意:这是目前的测试版

要从查询结果创建分区表,请将结果写入新的目标表。可以通过查询分区表或非分区表来创建分区表。不能使用查询结果将现有标准表更改为分区表


对我有效的是以下一组直接应用于“大查询”“大查询”“创建新查询”中的查询

创建新表?dataset.new_表 按日期\列划分 选择*从dataset.table_复制到_

然后,作为下一步,我放下桌子:

将TABLE dataset.TABLE_拖放到_副本

我从你那里得到了这个解决方案
仅使用第2步

如何确保第2步中的模式为DAY类型?除了DAY,我们还有什么其他类型呢?我有一个时间戳字段,我想用它来分区。我如何告诉系统应该使用该字段?因此,假设我有几年的数据,我需要为每天准备不同的查询并运行所有数据,假设我有1000天的历史记录,我需要支付源表中完整查询价格的1000倍?如果这是真的,那是难以置信的。我们正在积极地进行一次查询,使其能够做到这一点,但目前可以使用年、月、日分割策略来降低成本。首先划分为多个年度表,然后将每个年度表划分为月度表,然后将每个年度表划分为每日表。我们知道这对用户来说既昂贵又麻烦,所以我们希望很快有一个更简单、更便宜的解决方案。谢谢。@PavanEdara这方面有什么更新吗?对我的团队来说,这将是一个巨大、丑陋、昂贵的转变,否则:哇。现在我们来测试一下。Mikhail是什么工具/用户界面?@GrahamPolley–已经很长时间没有使用BigQuery Web用户界面了,顺便说一句,这无助于我维护好BQ Mate,所以我真的依赖于用户的反馈-仍在努力更新它,并在知道需要时进行修复,并且有一些空闲时间。@GrahamPolley–截至-这是什么工具/用户界面?-当然,这是我和我的团队根据商业用户的需求创建的少数工具之一——这弥补了谷歌Web UI中的许多不足。当它不能按需要执行时,我们就达到了这一点
甚至在我们的数量和规模上,大部分都崩溃了。我们已经使用这些工具好几年了——BQ团队正在慢慢添加一些功能/改进,但与我们的内部工具中需要和拥有的功能仍有很大差距。这可能是我在Stackoverflow Mikhail上见过的最巧妙的BigQuery解决方案。非常尊敬!upvotedBigQuery对行大小的限制是不是有~10或~20MB,这在除了小型数据集之外的任何地方都会使这种方法失效,因为对于小型数据集,表扫描无论如何都是便宜的,这里有一个要点可以自动生成接受答案所需的代码:希望节省一些时间上述要点也在RStudio的一篇博文中得到了进一步发展:请参阅以下问题,了解如何通过按周/月/年分区来绕过此限制:。您还可以仅通过一次扫描进行分区。我们也可以使用Java客户机来实现吗?我使用的是客户机版本1.34.0,似乎没有选择分区选项的选项。这只在RESTAPI中受支持吗?当我说RESTAPI时,我指的是旧API。谢谢你,我在尝试接受答案之前看到了你的答案。