Spark Parquet Partitioning:如何选择密钥

Jie*_*eng 5 apache-spark parquet pyspark

我发现默认情况下,Spark似乎写了许多小的镶木地板文件.我认为如果我使用分区来减少这种情况可能会更好吗?

但是如何选择分区键呢?例如,对于我经常通过ID查询的用户数据集,我是否进行分区id?但我想,在这种情况下,它会为1个用户创建1个镶木地板文件吗?

如果我经常通过2个键查询但只有1个或另外两个不同时查询,那么两个键分区是否有用呢?例如,可以说我平时通过查询idcountry,我用partitionBy('id', 'country')

如果我没有查询数据但想限制文件数量的特定模式,那我可以使用repartition吗?

Man*_*dés 7

分区为分区字段的每个值创建一个子目录,因此如果您按该字段进行过滤,而不是读取每个文件,它将只读取appropiate子目录中的文件.

  • 您应该在数据太大时进行分区,并且通常一次使用一部分数据.

  • 您应该按需要经常过滤具有低基数的字段进行分区,即:它将创建相对少量的目录,每个目录上的数据量相对较大.

例如,您不希望按唯一ID进行分区.它会创建许多目录,每个目录只有一行; 当您需要选择多个ID时,效率非常低.

如果您正在处理时间序列(例如每日数据转储),地理位置(国家,分支机构......)或分类(对象类型,制造商等),则某些典型的分区字段可能是日期.