从本地磁盘将数据加载到BigQuery和Google云存储的策略

时间:2016-08-10 20:03:21

标签: google-bigquery google-cloud-storage google-cloud-platform google-cloud-dataflow

我在本地磁盘中有2年大小约为300GB的组合数据,这是我从teradata中提取的。我必须将相同的数据加载到谷歌云存储和BigQuery表。

谷歌云存储中的最终数据应该以压缩格式进行日间隔离(每天文件应该是gz格式的单个文件)。 我还必须在日常分区表中加载BigQuery中的数据,即每天的数据应存储在一个分区中。

我首先将2年的合并数据加载到谷歌存储中。然后尝试使用谷歌数据流,通过使用数据流中的分区概念并将其加载到谷歌云存储(日常数据流分区与大查询分区不同)来明智地隔离数据。但是数据流不允许创建730个分区(2年),因为它遇到了 413请求实体太大(管道的序列化JSON表示的大小超过了允许的限制)。

所以我运行了两次数据流作业,每年过滤数据。 它过滤了每一年的数据并将其写入谷歌云存储中的单独文件中,但由于数据流当前无法写入压缩文件,因此无法压缩它。

看到第一种方法失败,我想过如上所述使用数据流中的分区来过滤1合并数据中的一年数据,并将其直接写入BigQuery,然后以压缩格式将其导出到谷歌存储。这个过程将重复两次。 但是在这种方法中,我不能一次写入超过45天的数据,因为我反复点击 java.lang.OutOfMemoryError:Java堆空间问题。所以这个先知也失败了

在制定压缩格式和BigQuery日期智能隔离迁移到谷歌存储的策略方面有任何帮助会有很大帮助吗?

1 个答案:

答案 0 :(得分:1)

让我们看看这是否会有所帮助?

步骤+伪代码

1 - 将组合数据(300GB)上传到BigQuery到CombinedData表

2 - 拆分年份(费用1x2x300GB = 600GB)

SELECT * FROM CombinedData WHERE year = year1 -> write to DataY1 table  
SELECT * FROM CombinedData WHERE year = year2 -> write to DataY2 table  

3 - 拆分为6个月(费用2x2x150GB = 600GB)

SELECT * FROM DataY1 WHERE month in (1,2,3,4,5,6) -> write to DataY1H1 table
SELECT * FROM DataY1 WHERE month in (7,8,9,10,11,12) -> write to DataY1H2 table
SELECT * FROM DataY2 WHERE month in (1,2,3,4,5,6) -> write to DataY2H1 table
SELECT * FROM DataY2 WHERE month in (7,8,9,10,11,12) -> write to DataY2H2 table

4 - 拆分为3个月(费用4x2x75GB = 600GB)

SELECT * FROM DataY1H1 WHERE month in (1,2,3) -> write to DataY1Q1 table
SELECT * FROM DataY1H1 WHERE month in (4,5,6) -> write to DataY1Q2 table
SELECT * FROM DataY1H2 WHERE month in (7,8,9) -> write to DataY1Q3 table
SELECT * FROM DataY1H2 WHERE month in (10,11,12) -> write to DataY1Q4 table

SELECT * FROM DataY2H1 WHERE month in (1,2,3) -> write to DataY2Q1 table
SELECT * FROM DataY2H1 WHERE month in (4,5,6) -> write to DataY2Q2 table
SELECT * FROM DataY2H2 WHERE month in (7,8,9) -> write to DataY2Q3 table
SELECT * FROM DataY2H2 WHERE month in (10,11,12) -> write to DataY2Q4 table

5 - 每个季度拆分为1个月和2个月(费用8x2x37.5GB = 600GB)

SELECT * FROM DataY1Q1 WHERE month = 1 -> write to DataY1M01 table
SELECT * FROM DataY1Q1 WHERE month in (2,3) -> write to DataY1M02-03 table
SELECT * FROM DataY1Q2 WHERE month = 4 -> write to DataY1M04 table
SELECT * FROM DataY1Q2 WHERE month in (5,6) -> write to DataY1M05-06 table  

Y(1/2)Q(1-4)表的其余部分相同

6 - 将所有双月份表拆分为单独的月份表(成本8x2x25GB = 400GB)

SELECT * FROM DataY1M002-03 WHERE month = 2 -> write to DataY1M02 table
SELECT * FROM DataY1M002-03 WHERE month = 3 -> write to DataY1M03 table
SELECT * FROM DataY1M005-06 WHERE month = 5 -> write to DataY1M05 table
SELECT * FROM DataY1M005-06 WHERE month = 6 -> write to DataY1M06 table

Y(1/2)M(XX-YY)表的其余部分相同

7 - 最后你有24个月度表,现在我希望你面临的限制将会消失,所以你可以继续你的计划 - 第二种方法让我们说 - 进一步分解每日表

我认为,成本方面这是最优化的方法,最终的查询成本是 (假设计费等级1)

4x600GB + 400GB = 2800GB = $14 

当然不要忘记删除中间表

注意:我对此计划不满意 - 但如果将原始文件拆分为BigQuery之外的每日块不是一个选项 - 这可以帮助