雪花不扣实木地板按柱隔断 [英] Snowflake is not deducting partitioned by column in Parquet

查看:18
本文介绍了雪花不扣实木地板按柱隔断的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个关于Snowflake的新功能-推断模式表函数的问题。推断模式函数在拼图文件上执行得非常出色,并返回正确的数据类型。但是,当拼图文件被分区并存储在S3中时,推断模式的功能与pyspark数据帧不同。

在DataFrames中,分区文件夹名称和值被读取为最后一列;是否有办法在Snowflake推断架构中实现相同的结果?

示例:

@GregPavlik-输入采用结构化拼花地板格式。当拼图文件存储在没有分区的S3中时,架构可以完美派生。

示例:{ ";agmt_gid";:1714844883, ";agmt_transs_gid";:640481290, &Quot;DT_Received&Quot;:&Quot;20 302&Quot;, &Quot;LATEST_TRANSACTION_CODE&QOT;:&QOOT;I&QOT; )

Snowflake推断架构为我提供了4个列名及其数据类型。

但是,如果镶木地板文件存储在分区中-如上图所示。

Under-LATEST_TRANSACTION_CODE=i/文件夹我会将文件设置为

示例:{ ";agmt_gid";:1714844883, ";agmt_transs_gid";:640481290, &Quot;DT_Received&Quot;:&Quot;20 302&Quot; )

在这种情况下,Snowflake Infer Schema仅提供三列;但是,读取Pyspark DataFrame中的同一文件会打印所有四列。

我想知道Snowflake中是否有读取分区拼花文件的解决方法。

推荐答案

在处理分区镶木地板文件时遇到雪花问题。 此问题不仅出现在INFER_SCHEMA中,以下流不会将按列分区作为Snowflake中的列:

  • 从镶木地板复制到表中
  • 从镶木地板合并到表中
  • 从镶木地板中选择
  • 从拼图推断架构(_S)

Snowflake将镶木地板文件视为文件,并忽略文件夹名称处的元信息。阿帕奇电光智能推演分区列

以下是处理此问题的方法,直到Snowflake团队处理此问题。

方法1

使用Snowflake metadata features处理此问题。

截至目前,雪花元数据仅提供

  • METADATA$FILENAME-当前行所属的分段数据文件的名称。包括舞台中数据文件的路径。
  • 元数据$FILE_ROW_NUMBER-每条记录的行号

我们可以这样做:

    select $1:normal_column_1, ..., METADATA$FILENAME  
        FROM
            '@stage_name/path/to/data/' (pattern => '.*.parquet')
    limit 5;

这将给出一个包含分区文件的完整路径的列。但我们需要处理从中推断出专栏的问题。例如:它将提供如下内容:

METADATA$FILENAME 
----------
path/to/data/year=2021/part-00020-6379b638-3f7e-461e-a77b-cfbcad6fc858.c000.snappy.parquet

我们可以执行regexp_place,并获得如下形式的分区值:

    select 
        regexp_replace(METADATA$FILENAME, '.*/year=(.*)/.*', '\1'
        ) as year
        $1:normal_column_1,  
    FROM
            '@stage_name/path/to/data/' (pattern => '.*.parquet')
    limit 5;
  • 在上面的regexp中,我们给出了分区键。
  • 第三个参数\1是正则表达式组匹配号。在我们的示例中,第一个组匹配-它保存分区值。

方法2

如果我们可以控制写入源拼接文件的流。

  • 添加与按列内容分区内容相同的重复列
  • 这应该在写给拼花之前发生。因此拼图文件将包含此列内容。
df.withColumn("partition_column", col("col1")).write.partitionBy("partition_column").parquet(path)
  • 使用此方法时,如果我们执行此操作一次,则在拼花地板的所有使用中(复制、合并、选择、推断),新列将开始出现。

方法3

如果我们无法控制写入源拼接文件的流。

  • 此方法更加特定于域和特定于数据模型。
  • 在许多用例中,我们需要反向设计分区依据列与数据的关联方式。
  • 是否可以从其他列生成?比方说,如果数据按年分区,其中年是从CREATED_BY列派生的数据,则可以再次重新生成该派生数据。
  • 可以和另一个雪花表连接生成吗?假设拼花有一个id,它可以与另一个表连接,在我们的列中动态派生

方法3更多地针对问题/领域。我们还需要在拼花地板的所有用例(复制、合并、选择等)中处理此问题。

这篇关于雪花不扣实木地板按柱隔断的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆