#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 последовательно обрабатывать каждый запрос следующим образом:
- Выполнить запрос
- Экспортируйте набор результатов (в виде CSV-файла) в папку stage в облачном хранилище с помощью двух мощных функций Snowflake:
- Функция RESULT_SCAN()
- Команда КОПИРОВАТЬ В <местоположение> для ЭКСПОРТА данных (которая является «противоположностью» команде КОПИРОВАТЬ В <таблицу>, используемой для ИМПОРТА данных)
- Загрузите файл 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».