如何捕获和下载雪花查询结果?

时间:2020-08-31 12:52:27

标签: snowflake-cloud-data-platform

我正在Windows PC上使用Snowflake。

例如:https:// .snowflakecomputing.com / console#/ internal / worksheet

我有一堆查询,我想捕获这些查询的集体输出并将其加载到文件中。

除了一次运行查询并使用复制粘贴来填充文件外,还有一种方法可以一次运行所有查询并将输出记录到PC上的文件中?

3 个答案:

答案 0 :(得分:1)

有许多方法可以实现您所寻求的高水平结果,但是您没有提供足够的背景信息来知道哪种方法最适合您的情况。例如,通过提及https://<my_org>.snowflakecomputing.com/console#/internal/worksheet,很明显,您当前正在计划通过Snowflake Web UI执行一系列查询。 使用Web UI对您的用例是否有严格要求?

如果没有,我建议您考虑将Python脚本(以及Snowflake Connector for Python)用于此类任务。一种策略是让Python脚本按以下顺序处理每个查询:

  1. 执行查询
  2. 通过Snowflake的两项强大功能将结果集(作为CSV文件)导出到云存储中的舞台位置:
  1. 通过Snowflake的GET命令将CSV文件下载到本地主机

以下是此类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允许您导出单个查询的结果,所以很遗憾他们没有将其扩展到类似“假脱机”提供的功能。