【问题标题】:- Unloading data from snowflake - each row to a separate file- 从雪花中卸载数据 - 每行到一个单独的文件
【发布时间】:2020-05-20 00:10:44
【问题描述】:

请分享您从雪花中卸载数据的经验 - 该表有数百万行,每行大约 16MB 数据。

“复制到'@ext_stg/path/file_name' from schema.table" 必须为每一行生成单独的文件。 意图是在 S3 中生成数百万个文件。

“复制到”旨在一次写入批量数据。 使用“复制到”为每一行生成单独的文件非常慢。

谢谢!

【问题讨论】:

  • 如何通过 COPY INTO 一次导出 1 条记录?你能在你的问题中包含你的陈述吗?这将有助于其他用户更准确地回答您的问题。

标签: snowflake-cloud-data-platform


【解决方案1】:

Snowflake 的 COPY INTO LOCATION 语句以 ndjson 格式写入,这已经使得通过一点本地处理来划分记录变得非常简单。

您似乎已经尝试过逐行迭代来执行此类单行导出,并且发现它预计会很慢。如果这只是一次操作,它可能仍然是一个可行的选择。

Snowflake 不提供任何并行拆分和每行导出技术(我知道),因此正常导出整个表可能更简单,然后使用下游并行处理框架 (such as a Spark job) 来将输入分成单独的记录文件。 ndjson 格式的可拆分特性使得在分布式程序框架中处理文件变得容易。

附:将 MAX_FILE_SIZE copy option 指定为非常低的值(低于行大小的最小界限)将不能保证每行有一个文件,因为写入是针对从表中一起读取的行集完成的。

【讨论】:

    【解决方案2】:

    您可以通过使用 python 编写脚本甚至使用雪花 javascript 程序来实现这一点。

    伪代码如下所示:

    var_filter_list = select primary_key from schema.table;  -- primary key or unique identifier
    
    for idx, pk_val in enumerate(var_filter_list):    -- for each row
      var_file_name = concat(file_name,idx)
      copy into @ext_stg/path/var_file_name  from ( select * from  schema.table where 
      primary_key = pk  );
    
    

    【讨论】:

      猜你喜欢
      • 2020-04-21
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 2022-01-22
      • 2021-12-24
      • 2022-12-06
      • 2020-09-30
      • 1970-01-01
      相关资源
      最近更新 更多