使用分区表和分桶表

分区是一种优化技术,用于根据某些属性将表划分为若干部分。

通常,分区只是将特定类型或值的项分组以便更快地访问的一种方法。这样做的好处是,对于只访问部分数据的查询,读取和加载时间会更快。例如,跟踪日志事件、消息和事件时间的日志表可能有数百万个条目,跨度长达数月。将这些条目按天进行分区,可以更快地查询某一天发生的日志事件。

Iceberg通过实现隐藏分区为用户简化了分区。Iceberg没有强制用户在查询时提供单独的分区过滤器,而是在底层处理分区和查询的所有细节。用户不需要维护分区列,甚至不需要理解物理表布局就可以得到准确的查询结果。

Iceberg有几个分区选项。用户可以按年、月、日和小时划分时间戳。Iceberg可以跟踪列值与其分区之间的关系,而不需要额外的列。例如,当在按日(day)分区、带有“YYYY-MM-DD hh:mm:ss”时间戳格式的数据上查询时,查询语句中不需要包含“hh:mm:ss”部分。Iceberg还可以通过标识、散列桶或截断来划分分类列值。

下面通过一个示例来了解如何使用Iceberg分区表,以及Iceberg分区表的一些特性。本示例需要一个数据集文件jd-formated.parquet,该文件包含2017年02月16日到2022年02月15日共五年的京东股票交易数据。首先将该数据集加载到DataFrame中,代码如下:

// 加载数据集到DataFrame
val file = "/data/spark/jd/jd-formated.parquet" 
val jdDF = spark.read.load(file)

// 查看schema和部分数据
jdDF.printSchema()
jdDF.show()

执行以上代码,输出内容如下:

root
 ......
          

......

抱歉,只有登录会员才可浏览!会员登录


《PySpark原理深入与编程实战》