Я просто ищу способ добавить массивные данные в таблицу BigQuery с использованием UDF.Итак, я попробовал рекомендуемый метод следующим образом:
#standardSQL
INSERT INTO `project.dataset.Quincy` (id, col)
WITH array_to_loop_through AS (
SELECT id
FROM UNNEST(GENERATE_ARRAY(1, 1000, 1)) id
)
SELECT id, CONCAT('Rank: ', CAST(id AS STRING))
FROM array_to_loop_through
Потребовалось 8 секунд, чтобы добавить 1 миллион значений в таблицу.Таким образом, я применил этот метод к своему UDF:
CREATE TEMPORARY FUNCTION myFunc()
RETURNS array<string>
LANGUAGE js AS
"""
a=[""];
for(i=0;i<=50;i++){
a.push(randomString(12));
}
return a;
"""
OPTIONS (
library="gs://kaneki110299/tester.js"
);
#standardSQL
INSERT INTO `Lambert.fortune` (password)
WITH array_to_loop_through AS (
SELECT *
FROM UNNEST(myFunc()) id
)
SELECT CONCAT(CAST(id AS STRING))
FROM array_to_loop_through
Когда я запускаю этот запрос в BigQuery, он выполняется в течение 5 минут, затем встречается тайм-аут UDF с 50 значениями.Та же ошибка произошла, когда я поместил цикл внутрь tester.js
.Итак, я попробовал другой способ:
CREATE TEMPORARY FUNCTION myFunc()
RETURNS string
LANGUAGE js AS
"""
return randomString(12);
"""
OPTIONS (
library="gs://kaneki110299/tester.js"
);
#standardSQL
INSERT INTO `Lambert.fortune` (password)
Values (myFunc()),(myFunc()),(myFunc())...//1000 times
В отличие от предыдущего запроса, этот запрос занимает всего 30 секунд, чтобы добавить 1000 значений из моего результата UDF в таблицу.Похоже, что цикл на BigQuery не работал хорошо или быстро.
Можно ли использовать параллельную поддержку или поддержку BigQuery любым способом для оптимизации производительности своего ЦП при запуске пользовательской функции для вставки массивных данных в его набор данных?Я попытался добавить 1 миллиард значений в таблицу, чтобы последний метод, который я использую, не казался практичным.