parquet 如何确定使用哪种编码?

Baa*_*ali 7 hadoop hive apache-spark parquet

语境:

  • 我有两个相同的数据集(例如左数据集和右数据集),每个数据集中有 112 个镶木地板文件。
  • 这些镶木地板文件是使用 Hive 通过转换分隔的平面文件创建的。
  • 用于创建分隔平面文件的过程在左进程和右进程之间略有不同。
  • 我注意到两个数据集之间存在显着的大小差异,即使它们的内容完全相同。左侧数据集为 400GB,右侧数据集为 420GB。
  • 当我使用 parquet-tools 检查 Parquet 模式时,我注意到左右数据集使用了不同的编码,如下所示(针对一列):

左边:

column_a:  INT64 SNAPPY DO:0 FPO:4 SZ:5179987/6161135/1.19 VC:770100 ENC:PLAIN,RLE,BIT_PACKED
Run Code Online (Sandbox Code Playgroud)

正确的:

column_a:  INT64 SNAPPY DO:0 FPO:4 SZ:3040269/5671813/1.87 VC:782499 ENC:BIT_PACKED,PLAIN,RLE,PLAIN_DICTIONARY
Run Code Online (Sandbox Code Playgroud)

我的问题:

parquet 如何确定要使用的编码类型以及什么可能使 parquet 选择不同的编码?我们可以使用 Hive / Spark 配置来控制它吗?

bns*_*ith 3

我认为此处的邮件列表消息和此处的回复具有我所知道的最佳答案。简而言之,您无法直接控制 Parquet 对任何给定列使用的编码。有些事情可能有助于稍微改进它,例如指定您希望编写 Parquet 版本 2 文件而不是 Parquet 版本 1 文件,但这不是精确的控制。也许有一些事情可以做,但这可能需要深入研究 Parquet 实现的内部结构。