我有一个100GB的表,我想在R中处理。当我将它导出到csvs时,我得到500个csv文件 - 当我在r中将它们读入数据表并绑定它们时 - 我得到一个巨大的数据表,它可以&# 39;保存/加载(即使我增加了安装R的虚拟实例的内存)。我想尝试一种不同的态度 - 将原始表分开,导出到R,然后单独处理每个表。问题是我不希望分裂到"打破"在一些分组的中间。例如 - 我的关键变量是"访问",每次访问可能有几行。我不希望有一个访问被分成不同的子表(因为我在R中的所有处理都是使用visit作为数据表的分组变量完成的)。最好的方法是什么?我试图按时间命令访问ID,只将它们的名称导出到一个特殊的csv等 - 所有的试验顺序都以错误结束(资源不足)。该表当前包含超过100M行,包含64个变量。
答案 0 :(得分:1)
我想尝试一种不同的态度 - 将原来的桌子分开......
问题是我不希望分裂到"打破"在一些分组的中间。
下面是如何识别批次,以便同一个visitid的行将在同一批次中 对于每个批处理,最大和最小的visitid被识别,以便您可以使用它们仅提取最小值和最大值之间的访问行,从而控制要处理的数据的大小
1 - 按行数批量
将下面的1000000替换为您想要的批量大小的行数
#legacySQL
SELECT
batch,
SUM(size) AS size,
COUNT(visitId) AS visitids_count,
MIN(visitId) AS visitId_min,
MAX(visitId) AS visitId_max
FROM (
SELECT
visitId,
size,
INTEGER(CEIL(total/1000000)) AS batch
FROM (
SELECT
visitId,
size,
SUM(size) OVER(ORDER BY visitId ) AS total
FROM (
SELECT visitId, COUNT(1) AS size
FROM [yourproject:yourdataset.yourtable]
GROUP BY visitId
)
)
)
GROUP BY batch
2 - 按批次的字节大小进行批处理
将下面的1000000000替换为您希望批量大小以字节为单位的任何内容
并将下面的123替换为一行的简单平均大小
#legacySQL
SELECT
batch,
SUM(size) AS size,
COUNT(visitId) AS visitids_count,
MIN(visitId) AS visitId_min,
MAX(visitId) AS visitId_max
FROM (
SELECT
visitId,
size,
INTEGER(CEIL(total/1000000000)) AS batch
FROM (
SELECT
visitId,
size,
SUM(size) OVER(ORDER BY visitId ) AS total
FROM (
SELECT visitId, SUM(123) AS size
FROM [yourproject:yourdataset.yourtable]
GROUP BY visitId
)
)
)
GROUP BY batch
以上可帮助您准备好使用批次最小值和最大值来正确分割原始表格 希望这有助于您继续进一步
注意:上面假设visitid的行正常分布,表中的行数相对较大(如示例所示),因此批量的大小合理均匀
注意2:我意识到我在Legacy SQL中快速编写了它,所以下面是标准SQL中的版本,如果你想要migrate或已经使用它
#standardSQL
SELECT
batch,
SUM(size) AS size,
COUNT(visitId) AS visitids_count,
MIN(visitId) AS visitId_min,
MAX(visitId) AS visitId_max
FROM (
SELECT
visitId,
size,
CAST(CEIL(total/1000000) as INT64) AS batch
FROM (
SELECT
visitId,
size,
SUM(size) OVER(ORDER BY visitId ) AS total
FROM (
SELECT visitId, COUNT(1) AS size
FROM `yourproject.yourdataset.yourtable`
GROUP BY visitId
)
)
)
GROUP BY batch