#node.js #google-apps-script #google-bigquery #google-cloud-storage
# #node.js #google-apps-script #google-bigquery #google-облачное хранилище
Вопрос:
Я ищу эффективный способ загрузить следующий массив в таблицу больших запросов в этом формате :
Большие столбцы запроса (пример)
event_type: video_screen
event_label: click_on_screen
is_ready:false
time:202011231958
long:1
high:43
lenght:0
**
Объект массива
**
[["video_screen","click_on_screen","false","202011231958","1","43","0"],["buy","error","2","202011231807","1","6","0"],["sign_in","enter","user_details","202011231220","2","4","0"]]
Я подумал о нескольких вариантах, но ни один из них не кажется лучшей практикой.
Вариант A: загрузите следующий файл в хранилище Google, а затем создайте таблицу, связанную с этим сегментом — не работает из-за формата файла, Google Bigquery не может проанализировать массив из Google bucket.
Вариант B: использование серверной частью (node.js ) изменить структуру файла на CSV и загрузить его непосредственно в Bigquery — не удалось из-за задержки (массив длинный, больше, чем в моем примере).
Вариант C: используйте Google Appcript, чтобы получить объект массива и вставить его в Bigquery — я не нашел простого кода для этого, в Google Storage нет API, подключенного к Appscript.
Кто-нибудь сталкивался с таким случаем и может поделиться своим решением? Какова наилучшая практика для этого случая? если у вас есть код для этого, это будет здорово.
Комментарии:
1. Вариант D, записать файл в csv или другом поддерживаемом формате напрямую. Затем вы можете легко вставлять строки в BQ
2. Каков размер самой длинной строки в вашем файле?
3. 100 тыс. строк на файл, но я обрабатываю несколько файлов каждые 5 минут.
4. Строки в файле не проблема. Какая самая длинная строка в вашем файле? 1 одна строка какой длины?
5. 6 столбцов, максимум 10.
Ответ №1:
Загрузите файл из GCS в BigQuery в таблицу с 1 единственным string
столбцом. Таким образом, вы получаете 100 тысяч строк и один единственный столбец.
По сути, у вас будет таблица, содержащая JSON в строке.
Используйте JSON_EXTRACT_ARRAY для обработки массива JSON в elements
затем позже извлеките каждую позицию в соответствующую переменную / столбец и запишите ее в таблицу
вот демонстрация:
with t as (
select '[["video_screen","click_on_screen","false","202011231958","1","43","0"],["buy","error","2","202011231807","1","6","0"],["sign_in","enter","user_details","202011231220","2","4","0"]]' as s
),
elements as (
select e from t,unnest(JSON_EXTRACT_ARRAY(t.s)) e
)
select
json_extract_scalar(e,'$[0]') as event_type ,
json_extract_scalar(e,'$[1]') as event_label,
from elements
вывод:
Комментарии:
1. Звучит неплохо, но как загрузить файл из GCS в BigQuery в таблицу с 1 однострочным столбцом и 100 тыс. строк? BigQuery не может проанализировать этот тип файла [[1,2,3],[1,2,3]]
2. @idan Загрузить в формате CSV и указать разделитель, который не существует в вашей строке, например TAB или ~, или ^. Таким образом, вы загружаете всю строку как 1 столбец.
3. Весь файл вводится в одну ячейку, как создать отдельную ячейку?
4. Это означает, что весь ваш ввод находится в одной строке. Это не проблема, если файл введен в одну ячейку. Это именно то, что вам нужно. Теперь используйте мой пример, чтобы разнести его.
5. Я не уверен, что это правильно, все данные будут вводиться в одну ячейку? ограничений нет? Ограничение строки?