使用多行达到 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 限制的主要内容,如果未能解决你的问题,请参考以下文章