Как мне захватить и загрузить результаты запроса Snowflake?

#snowflake-cloud-data-platform

#snowflake-платформа облачных данных

Вопрос:

Я использую Snowflake на ПК с Windows.

Например: https://<my_org>.snowflakecomputing.com/console#/internal/worksheet

У меня есть куча запросов, совокупный вывод которых я хочу захватить и загрузить в файл.

Помимо выполнения запросов по одному и использования копирования и вставки для заполнения файла, есть ли способ, которым я могу выполнить все запросы одновременно и записать выходные данные в файл на моем компьютере?

Комментарии:

1. Можете ли вы выполнить объединение и вставить его непосредственно в таблицу? Также, если вы хотите написать это с помощью программирования, есть другие варианты? Дайте мне знать. Также укажите запросы, которые вы делаете. Я могу взглянуть. Спасибо.

Ответ №1:

Есть много способов достичь результата высокого уровня, который вы ищете, но вы не предоставили достаточно контекста, чтобы понять, какой из них лучше всего подходит для вашей ситуации. Например, из упоминания https://<my_org>.snowflakecomputing.com/console#/internal/worksheet становится ясно, что в настоящее время вы планируете выполнить серию запросов через веб-интерфейс Snowflake. Является ли использование веб-интерфейса строгим требованием вашего варианта использования?

Если нет, я бы рекомендовал вам рассмотреть возможность использования скрипта Python (вместе с соединителем Snowflake для Python) для подобной задачи. Одной из стратегий было бы заставить скрипт Python последовательно обрабатывать каждый запрос следующим образом:

  1. Выполнить запрос
  2. Экспортируйте набор результатов (в виде CSV-файла) в папку stage в облачном хранилище с помощью двух мощных функций Snowflake:
  1. Загрузите файл CSV на свой локальный хост с помощью команды Snowflake GET

Вот пример того, как может выглядеть такой скрипт на Python…

 import snowflake.connector

query_array = [r"""
SELECT ...
  FROM ...
 WHERE ...
""",r"""
SELECT ...
  FROM ...
 WHERE ...
"""
]

conn = snowflake.connector.connect(
  account = ...
 ,user = ...
 ,password = ...
 ,role = ...
 ,warehouse = ...
)

file_number = 0;
for query in query_array:
  file_number  = 1
  file_name = f"{file_prefix}_{file_number}.csv.gz"

  rs_query = conn.cursor(snowflake.connector.DictCursor).execute(query)
  query_id = rs_query.sfqid  # Retrieve query ID for query execution

  sql_copy_into = f"""
COPY INTO @MY_STAGE/{file_name}
  FROM (SELECT * FROM TABLE(RESULT_SCAN('{query_id}')))
  DETAILED_OUTPUT = TRUE
  HEADER = TRUE
  SINGLE = TRUE
  OVERWRITE = TRUE
"""
  rs_copy_into = conn.cursor(snowflake.connector.DictCursor).execute(sql_copy_into)

  for row_copy_into in rs_copy_into:
    file_name_in_stage = row_copy_into["FILE_NAME"]

    sql_get_to_local = f"""
GET @MY_STAGE/{file_name_in_stage} file://.
"""

    rs_get_to_local = conn.cursor(snowflake.connector.DictCursor).execute(sql_get_to_local)
  

Примечание: Я выбрал (по соображениям производительности) экспортировать и передавать файлы в виде архивированных файлов (gz); вы могли бы пропустить это, передав COMPRESSION=NONE параметр в команде КОПИРОВАТЬ В <местоположение>.

Кроме того, если ваши наборы результатов намного меньше, вы могли бы использовать совершенно другую стратегию и просто заставить Python извлекать и записывать результаты каждого запроса непосредственно в локальный файл. Я предположил, что ваши наборы результатов могут быть больше, поэтому я использовал здесь опцию export download.

Комментарии:

1. Спасибо, Даррен. Все это довольно сложные решения того, что должно быть простой проблемой. У меня есть история с Oracle и в SQL * Плюс это очень легко сделать с помощью команды «spool». Я вижу, что Snowflake позволяет экспортировать результаты одного запроса, поэтому жаль, что они не расширяют это до чего-то вроде функциональности, предлагаемой «spool».

Ответ №2:

Для этого вы можете использовать клиент SnowSQL. Смотрите https://docs.snowflake.com/en/user-guide/snowsql.html

После того, как вы настроите его, вы можете создать пакетный файл или аналогичный, который вызывает SnowSQL для выполнения каждого из ваших запросов и записи выходных данных в файл. Что-то вроде:

 @echo off
>output.txt (
  snowsql -q "select blah"
  snowsql -q "select blah"
  ...
  snowsql -q "select blah"
)
  

Комментарии:

1. Спасибо Nat. Все это довольно сложные решения того, что должно быть простой проблемой. У меня есть история с Oracle и в SQL * Плюс это очень легко сделать с помощью команды «spool». Я вижу, что Snowflake позволяет экспортировать результаты одного запроса, поэтому жаль, что они не расширяют это до чего-то вроде функциональности, предлагаемой «spool».