我创建的是铜牌还是银牌 table?

Am I creating a Bronze or a Silver table?

据我了解,Delta Lake 架构中的青铜 table 代表 table 格式的原始和(或多或少)未修改的数据。这是否意味着我也不应该为青铜 table 分区数据?您可以将分区视为取决于用例的东西,它指向白银甚至黄金 table.

看这个例子:

def read():
    return spark.read\
        .format("csv")\
        .option("delimiter", "\t")\
        .option("header", True)\
        .load("file.tsv.gz")

table_name = "file"
location = f"/mnt/storage/{table_name}"

read().write.partitionBy("something").format("delta").save(location)

spark.sql(f"CREATE TABLE {table_name} USING DELTA LOCATION '{location}/'")

注意 partitionBy("something")。这属于青铜 table 吗?

一般来说,我建议不要在青铜层中通过谓词进行分区。您应该使用 OPTIMIZE 维护 'right-sized' 文件以供后续读取,而不会对存储中的数据组织方式引入额外偏差。

分区和 Z-Ordering 可以通过改进数据跳过来加快读取速度。然而,隐含在您选择分区依据的谓词中是一些业务逻辑。这可能会给您的数据带来某种形式的偏差,并可能对您的管道产生意想不到的下游影响。 'bronze' 的概念是简单地将数据按原样登陆湖中,尽可能少地更改。

这可能有例外,但这些是一般考虑因素。