【问题标题】:Limit array size to 1MB in BigQuery在 BigQuery 中将数组大小限制为 1MB
【发布时间】:2019-06-03 23:44:48
【问题描述】:

我在 BigQuery 中执行以下操作:

SELECT ARRAY_AGG(state IGNORE NULLS LIMIT 10000) 
FROM mytable
GROUP BY state

将结果限制为不大于 1MB 的最佳方法是什么?以前我在 ARRAY_AGG 中做一个 LIMIT,但如果有大文本字段,这通常会超过限制,所以我更愿意通过最终结果大小来限制它。

【问题讨论】:

  • 您的查询实际上没有意义。您正在通过state 进行聚合,并将其作为array_agg() 的参数。
  • @GordonLinoff,对,这只是一个虚构的例子,它会显示类似ca,ca,ca,ca,ca...
  • @David542 - 您是否能够评估/尝试我在回答中提供的选项?

标签: sql google-bigquery


【解决方案1】:

选项之一(BigQuery 标准 SQL)

#standardSQL
WITH temp AS (
  SELECT state, SUM(LENGTH(state)) OVER(ORDER BY pos) size 
  FROM (
    SELECT state, ROW_NUMBER() OVER() pos
    FROM `project.dataset.table`
  )
)
SELECT ARRAY_AGG(state IGNORE NULLS)
FROM temp
WHERE size < 1000000    

您可以使用下面的虚拟示例测试、玩上面的内容:

#standardSQL
WITH `project.dataset.table` AS (
  SELECT REPEAT('a', CAST(100 * RAND() AS INT64)) state
  FROM UNNEST(GENERATE_ARRAY(1, 100))
), temp AS (
  SELECT state, SUM(LENGTH(state)) OVER(ORDER BY pos) size 
  FROM (
    SELECT state, ROW_NUMBER() OVER() pos
    FROM `project.dataset.table`
  )
)
SELECT ARRAY_AGG(state IGNORE NULLS)
FROM temp
WHERE size < 5000 

【讨论】:

  • 一些问题: 1. ROW_NUMBER() OVER() 对于无序分区未定义。所以它什么也没做。 2. 由于 SUM() 没有 window_frame 子句,它适用于整个分区。这意味着它将对所有内容评估为相同的值。 3. 虽然我们不知道类型,但 LENGTH 可能不正确。如果这是一个字符串,它应该是 BYTE_LENGTH。 LENGTH 给出字符数。
  • @StephenWeinberg - 答案通常和问题一样好 - 我的答案是有效的并且与所要求的完全匹配。因此,您宁愿将您的 cmets 和批评转化为您自己的答案 - 如果它不完美,我也可以投反对票!
  • 如果我冒犯了我很抱歉。最大的问题是 SUM() 没有窗口框架。这将导致 size
  • @StephenWeinberg - 你们这些 cmets 完全错了! ROW_NUMBER() OVER() 按预期生成编号,然后 SUM() OVER(order by pos) 没有任何问题。所以你的整个观点是不正确的!!!考虑首先使用答案中的示例测试提出的解决方案,然后像您一样进行评论。如果您意识到自己错了并且愿意恢复您的反对票 - 请告诉我!而且,顺便说一句,请记住 - 这是针对 Google BigQuery 而不仅仅是抽象 sql
  • 你是对的。对于那个很抱歉。第一个和第二个都是我自己的误解。 SUM() OVER() 像我说的那样做,但是 SUM OVER(ORDER BY $something) 做的是正确的事情。在这种情况下,ROW_NUMBER() 以任意顺序给出行号......但这并不重要,因为整个要点是 ORDER BY 某事。如果帖子被编辑并且允许我,我将撤销我的反对票。有趣的是,避免 ROW_NUMBER 的一种方法是 SUM() OVER(ROWS UNBOUNDED PRECEDING)。
猜你喜欢
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2012-05-13
相关资源
最近更新 更多