Можно ли разбить вывод JSON из Snowflake на отдельные строки с помощью LIMIT/OFFSET?

Вопрос или проблема

У меня есть запрос в Snowflake, который выдает json-вывод в строках. Более 29,000 строк. Я использую этот запрос для создания записей в системе MDM. Однако этот процесс загрузки немного неэффективен и дорогостоящ. Я взял свой окончательный оператор SELECT, который создавал json, и поместил его в CTE. Затем я сделал новый окончательный оператор SELECT.

SELECT ARRAY_AGG(*) as clin_prov
FROM clin_prov

Это перегрузило систему своим размером. Использование LIMIT в CTE на 1000 и даже 5000 давало результаты, создавая большой json-запись, как и ожидалось, и как я хотел. Я хотел бы получить 30 строк массивов с <= 1000 json-записей в окончательном выводе. Есть ли способ это сделать? Могу ли я создать массивы на основе LIMIT и OFFSET и передать их в отдельные строки? Я

Я пробовал с LIMIT и без него в clin_prov cte. Я пытался использовать отдельные ctes на основе LIMIT и OFFSET, а затем UNION ALL. Это тоже перегрузило систему.

Да, вы можете выполнять пакетную обработку. Попробуйте ниже, изменив значение NTILE для числа партий.

WITH clin_prov AS (
  SELECT 
    ..., 
    NTILE(50) OVER (ORDER BY some_column) AS batch
  FROM 
    ...
)
SELECT batch, ARRAY_AGG(your_json_column) AS clin_prov
FROM clin_prov
GROUP BY batch
ORDER BY batch

Ответ или решение

Да, вы можете обрабатывать данные в пакетном режиме в Snowflake, используя функцию NTILE для разделения объема данных на более мелкие группы, что позволит избежать перегрузки системы из-за больших объемов JSON.

Вот пример, как это можно сделать. Сначала создается временная итоговая таблица (CTE), в которой данные делятся на пакеты, а затем агрегируются в массивы.

WITH clin_prov AS (
  SELECT 
    your_columns, 
    your_json_column,
    NTILE(30) OVER (ORDER BY some_column) AS batch
  FROM 
    your_source_table
)
SELECT 
  batch, 
  ARRAY_AGG(your_json_column) AS clin_prov
FROM 
  clin_prov
GROUP BY 
  batch
ORDER BY 
  batch;

В этом примере:

  1. Замените your_columns, your_json_column, и your_source_table на актуальные названия столбцов и таблиц, которые вы используете.
  2. NTILE(30) используется для создания 30 различных пакетов. Это означает, что система будет делить данные на 30 равных частей, каждая из которых будет содержать примерно одинаковое количество записей. Вы можете изменить 30 на любое другое значение, если необходимо больше или меньше пакетов.
  3. ORDER BY some_column определяет порядок, в котором данные будут разбиваться на пакеты. Убедитесь, что some_column — это столбец с уникальными значениями, чтобы обеспечить равномерное распределение.

Таким образом, вы получите результат в виде строк, где каждая строка будет представлять собой массив JSON из your_json_column с количеством записей, ограниченным в соответствии с заданным количеством пакетов. Такой подход значительно снизит нагрузку на систему и упростит процесс инжекции данных в вашу MDM-систему.

Оцените материал
Добавить комментарий

Капча загружается...