我正在Windows PC上使用Snowflake。
例如:https://
我有一堆查询,我想捕获这些查询的集体输出并将其加载到文件中。
除了一次运行查询并使用复制粘贴来填充文件外,还有一种方法可以一次运行所有查询并将输出记录到PC上的文件中?
答案 0 :(得分:1)
有许多方法可以实现您所寻求的高水平结果,但是您没有提供足够的背景信息来知道哪种方法最适合您的情况。例如,通过提及https://<my_org>.snowflakecomputing.com/console#/internal/worksheet
,很明显,您当前正在计划通过Snowflake Web UI执行一系列查询。 使用Web UI对您的用例是否有严格要求?
如果没有,我建议您考虑将Python脚本(以及Snowflake Connector for Python)用于此类任务。一种策略是让Python脚本按以下顺序处理每个查询:
以下是此类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)文件;您可以通过在COPY INTO COMPRESSION=NONE
选项来跳过此操作。
此外,如果结果集要小得多,则可以使用完全不同的策略,只需让Python拉取并将每个查询的结果直接写到本地文件中即可。我认为您的结果集可能更大,因此我在这里使用了导出+下载选项。
答案 1 :(得分:0)
您可以为此使用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"
)
答案 2 :(得分:0)
感谢达伦和纳特。
这些都是解决一个简单问题的非常复杂的解决方案。
我有使用Oracle的历史,在SQL * Plus中,使用“假脱机”命令非常容易。
我看到Snowflake允许您导出单个查询的结果,所以很遗憾他们没有将其扩展到类似“假脱机”提供的功能。