Выход за пределы ограничений Bigquery JS UDF с несколькими строками

У меня проблемы с ограничениями BigQuery JS UDF. Единственный задокументированный предел памяти [1] - этоapproximately 5 MB or lessограничить количество данных, выводимых UDF, поэтому я установил внутреннюю проверку для возврата ошибки, когда выходной буфер превышает ~3 МБ (до преобразования 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

Идентификатор задания: cartodb-gcp-backend-data-team:US.bquxjob_3f216117_170c4d2abae

Я не уверен, что это важно, но данные, передаваемые в UDF, могут быть большими (~20 МБ в этом примере), а результат имеет тип BYTE (самый большой - 2,71 МБ, как сообщает Length(mvt)).

В прошлом была аналогичная проблема [2], на которую ссылались как на возможную проблему с v8, но у меня нет способа узнать, такая же ли это проблема.

Это проблема в моем UDF или проблема в v8+Bigquery? Я протестировал эквивалентный код под узлом, и память остается стабильной (никаких заметных утечек после работы в течение 20-30 минут).

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

[2] - /questions/11455388/pamyat-bigquery-udf-prevyisila-oshibku-v-neskolkih-strokah-no-otlichno-rabotaet-v-odnoj-stroke/11455393#11455393

Изменить: сообщил об этом в системе отслеживания ошибок: https://issuetracker.google.com/u/1/issues/151212192

1 ответ

Когда вы говорите: "Я достиг пределов при запуске UDF для ряда строк, хотя по отдельности они работают нормально". Я думаю, что это точная причина, по которой вы достигли пределов, поскольку "Документация по ограничениям UDF" относится к одной строке следующим образом:

"Объем данных, который ваш JavaScript UDF выводит при обработке одной строки - примерно 5 МБ или меньше".

Другие вопросы по тегам