BigQuery导出到csv并在R中加载巨大的表

时间:2017-02-12 13:39:19

标签: r google-bigquery

我有一个100GB的表,我想在R中处理。当我将它导出到csvs时,我得到500个csv文件 - 当我在r中将它们读入数据表并绑定它们时 - 我得到一个巨大的数据表,它可以&# 39;保存/加载(即使我增加了安装R的虚拟实例的内存)。我想尝试一种不同的态度 - 将原始表分开,导出到R,然后单独处理每个表。问题是我不希望分裂到"打破"在一些分组的中间。例如 - 我的关键变量是"访问",每次访问可能有几行。我不希望有一个访问被分成不同的子表(因为我在R中的所有处理都是使用visit作为数据表的分组变量完成的)。最好的方法是什么?我试图按时间命令访问ID,只将它们的名称导出到一个特殊的csv等 - 所有的试验顺序都以错误结束(资源不足)。该表当前包含超过100M行,包含64个变量。

1 个答案:

答案 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