Spark Parquet 分区:如何选择键
Spark Parquet Partitioning: How to choose a key
我发现默认情况下,Spark 似乎会编写许多小的 parquet 文件。我认为如果我使用分区来减少它可能会更好?
但是如何选择分区键?例如,对于我经常按 ID 查询的用户数据集,我是否按 id
进行分区?但我在想,在这种情况下,它会为 1 个用户创建 1 个镶木地板文件吗?
如果我经常查询 2 个键但同时只查询 1 个或另一个而不是两者,那么按两个键分区是否有用?例如,假设我通常通过 id
和 country
查询,我是否使用 partitionBy('id', 'country')
?
如果我查询数据没有特定的模式,但想限制文件的数量,那么我使用repartition
吗?
分区为分区字段的每个值创建一个子目录,因此如果您按该字段过滤,它不会读取每个文件,它只会读取适当子目录中的文件。
当你的数据太大时你应该分区并且你通常
一次处理数据的一个子集。
您应该按双方都需要过滤的字段进行分区
经常 and 具有低基数,即:它将创建一个
数量相对较少的目录
每个目录的数据。
例如,您不想按唯一 ID 进行分区。它会创建很多目录,每个目录只有一行;当您需要 select 多个 id 时,这是非常低效的。
如果您正在处理时间序列(例如每日转储数据)、地理(国家、分支机构...)或分类法(对象类型、制造商等),一些典型的分区字段可能是日期。
我发现默认情况下,Spark 似乎会编写许多小的 parquet 文件。我认为如果我使用分区来减少它可能会更好?
但是如何选择分区键?例如,对于我经常按 ID 查询的用户数据集,我是否按 id
进行分区?但我在想,在这种情况下,它会为 1 个用户创建 1 个镶木地板文件吗?
如果我经常查询 2 个键但同时只查询 1 个或另一个而不是两者,那么按两个键分区是否有用?例如,假设我通常通过 id
和 country
查询,我是否使用 partitionBy('id', 'country')
?
如果我查询数据没有特定的模式,但想限制文件的数量,那么我使用repartition
吗?
分区为分区字段的每个值创建一个子目录,因此如果您按该字段过滤,它不会读取每个文件,它只会读取适当子目录中的文件。
当你的数据太大时你应该分区并且你通常 一次处理数据的一个子集。
您应该按双方都需要过滤的字段进行分区 经常 and 具有低基数,即:它将创建一个 数量相对较少的目录 每个目录的数据。
例如,您不想按唯一 ID 进行分区。它会创建很多目录,每个目录只有一行;当您需要 select 多个 id 时,这是非常低效的。
如果您正在处理时间序列(例如每日转储数据)、地理(国家、分支机构...)或分类法(对象类型、制造商等),一些典型的分区字段可能是日期。