雪花不扣实木地板按柱隔断 [英] Snowflake is not deducting partitioned by column in Parquet
问题描述
我有一个关于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屋!