【问题标题】:BigQuery export to csv and load in R for huge tablesBigQuery 导出到 csv 并在 R 中加载大型表
【发布时间】:2017-02-12 13:39:18
【问题描述】:

我有一个 100GB 的表,我想在 R 中处理它。当我将它导出到 csvs 时,我得到 500 个 csv 文件 - 当我在 r 中将它们读入数据表并绑定它们时 - 我得到一个巨大的数据表,它不能t 被保存/加载(即使我增加了安装 R 的虚拟实例的内存)。我想尝试不同的态度——拆分原始表,导出到 R,然后分别处理每个表。问题是我不希望拆分在某些分组中间“中断”。例如 - 我的关键变量是“访问”,每次访问可能有几行。我不希望将访问分为不同的子表(因为我在 R 中的所有处理都是使用访问作为数据表的分组变量完成的)。最好的方法是什么?我尝试按时间订购访问 ID,仅将他们的名称导出到单独的 csv 等 - 所有的试验订单都以错误结束(资源不足)。该表目前包含超过 1 亿行,有 64 个变量。

【问题讨论】:

  • 将数据分组如何?
  • @RomanLuštrik 我不确定你到底是什么意思 - 我应该如何按组执行此操作?
  • 见米哈伊尔的回答,这就是我的意思。 :)
  • 从 BigQuery 中提取大型数据集以便您可以在其他一些内存有限的环境中处理它们是一种疯狂的做法。 BigQuery 的重点在于它可以处理大型数据集,而无需担心本地处理或内存限制。您需要一种让 R 直接链接到 BigQuery 的方法,因此只需将查询结果传递回 R。试试bigrquery 之类的方法。

标签: r google-bigquery


【解决方案1】:

我想尝试不同的态度 - 拆分原来的表......
问题是我不希望拆分在某些分组中间“中断”。

以下是如何识别批次,以使相同 visitid 的行位于同一批次中
对于每个批次的最大和最小访问ID,您可以使用它们来仅提取最小和最大值之间的那些访问ID的行,从而控制要处理的数据的大小

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

【讨论】:

    猜你喜欢
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    相关资源
    最近更新 更多