使用多行达到 Bigquery JS UDF 限制

Posted

技术标签:

【中文标题】使用多行达到 Bigquery JS UDF 限制【英文标题】:Hitting Bigquery JS UDF limits with multiple rows 【发布时间】:2020-03-10 14:30:27 【问题描述】:

我遇到了 BigQuery JS UDF 限制问题。记录的唯一内存限制 [1] 是对 UDF 输出的数据量的approximately 5 MB or less 限制,因此我设置了内部检查以在输出缓冲区超过 ~3MB 时返回错误(在 base64 转换之前);但即便如此,在对一系列行运行 UDF 时,我还是遇到了限制,尽管它们单独工作正常。

例如,Resources exceeded during query execution: UDF out of memory. 失败

WITH joined_data AS
(
  SELECT z, x, y, ARRAY_AGG(data) as data
  FROM `rmr_tests.z6_pre_agg`
  WHERE x = 14
  GROUP BY z, x, y
)
SELECT z, x, y, rmr_tests.UDFNAME(data, 4096, '') as mvt from joined_data

职位编号:cartodb-gcp-backend-data-team:US.bquxjob_1628ffa1_170c4d0d50f

另一方面,如果我欺骗 Bigquery 以不同方式对 UDF 的调用进行批处理,我没有任何问题:

WITH joined_data AS
(
  SELECT z, x, y,
      ARRAY_AGG(data) as data,
      ABS(MOD(FARM_FINGERPRINT(CONCAT(CAST(x AS STRING), y, CAST(z AS STRING))), 5)) AS r
  FROM `rmr_tests.z6_pre_agg`
  WHERE x = 14
  GROUP BY z, x, y
)
SELECT z, x, y, rmr_tests.UDFNAME(data, 4096, '') as mvt FROM joined_data WHERE r = 0
UNION ALL 
SELECT z, x, y, rmr_tests.UDFNAME(data, 4096, '') as mvt FROM joined_data WHERE r = 1
UNION ALL 
SELECT z, x, y, rmr_tests.UDFNAME(data, 4096, '') as mvt FROM joined_data WHERE r = 2
UNION ALL 
SELECT z, x, y, rmr_tests.UDFNAME(data, 4096, '') as mvt FROM joined_data WHERE r = 3
UNION ALL 
SELECT z, x, y, rmr_tests.UDFNAME(data, 4096, '') as mvt FROM joined_data WHERE r = 4

工作 ID:cartodb-gcp-backend-data-team:US.bquxjob_3f216117_170c4d2abae

我不确定它是否重要,但传递给 UDF 的数据可能很大(在本例中约为 20 MB)并且输出类型为 BYTE(最大为 2.71 MB,由 Length(mvt) 报告)。

过去 [2] 有一个类似的问题,它被引用为 v8 的一个可能问题,但我无法知道它是否是同一个问题。

这是我的 UDF 中的问题还是 v8+Bigquery 中的问题?我在 node 下测试了一个等效的代码,内存保持稳定(运行 20-30 分钟后没有明显的泄漏)。

[1] - https://cloud.google.com/bigquery/docs/reference/standard-sql/user-defined-functions

[2] - https://***.com/a/35563562

编辑:在错误跟踪器中报告:https://issuetracker.google.com/u/1/issues/151212192

【问题讨论】:

【参考方案1】:

当您说“我在针对一系列行运行 UDF 时遇到了限制,尽管它们单独工作正常”。我认为这就是您达到限制的确切原因,因为 "UDF limits documentation" 指的是单行,如下所示:

“您的 javascript UDF 在处理单行时输出的数据量——大约 5 MB 或更少。”

【讨论】:

正如我所说,每一行都小于 3 MB,并且可以单独处理它们。也许我误解了你,但我不明白只有在多行上多次调用函数时才能达到这个限制。 我可以看到您已经在公共问题跟踪器中打开了一个案例,在阅读了该主题后,我建议您针对您的上一条评论打开一个新案例,以便您获得相应的帮助

以上是关于使用多行达到 Bigquery JS UDF 限制的主要内容,如果未能解决你的问题,请参考以下文章

UDF 上的 Bigquery 配额限制

在 BigQuery UDF 中使用 js 包

JS UDF 返回标准 SQL / BigQuery 的结构并创建两列

从 js UDF 输出 INT64

在 BigQuery 中创建 UDF

在 Google BigQuery 中限制存储使用量