Загрузить файл массива в большой запрос

#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. Я не уверен, что это правильно, все данные будут вводиться в одну ячейку? ограничений нет? Ограничение строки?