Spark 分区 - 使用 DISTRIBUTE BY 选项
Spark partitions - using DISTRIBUTE BY option
我们有一个应该处理 50MM 行的 Spark 环境。这些行包含一个键列。密钥的唯一数量接近 2000。我想并行处理所有这 2000 个密钥。因此我们使用如下所示的 Spark sql
hiveContext.sql("select * from BigTbl DISTRIBUTE by KEY")
随后我们有一个 mapPartitions 可以很好地并行处理所有分区。但是问题是,它默认只创建 200 个分区。使用如下命令我可以增加分区
hiveContext.sql("set spark.sql.shuffle.partitions=500");
然而在实际生产中运行我不知道唯一键的数量是多少。我希望这是自动管理的。请问有什么办法吗
谢谢
巴拉
我建议您使用 "repartition" 函数,然后将重新分区的文件注册为新临时文件 table 并进一步缓存它以加快处理速度。
val distinctValues = hiveContext.sql("select KEY from BigTbl").distinct().count() // find count distinct values
hiveContext.sql("select * from BigTbl DISTRIBUTE by KEY")
.repartition(distinctValues.toInt) // repartition to number of distinct values
.registerTempTable("NewBigTbl") // register the repartitioned table as another temp table
hiveContext.cacheTable("NewBigTbl") // cache the repartitioned table for improving query performance
如需进一步查询,请使用 "NewBigTbl"
我们有一个应该处理 50MM 行的 Spark 环境。这些行包含一个键列。密钥的唯一数量接近 2000。我想并行处理所有这 2000 个密钥。因此我们使用如下所示的 Spark sql
hiveContext.sql("select * from BigTbl DISTRIBUTE by KEY")
随后我们有一个 mapPartitions 可以很好地并行处理所有分区。但是问题是,它默认只创建 200 个分区。使用如下命令我可以增加分区
hiveContext.sql("set spark.sql.shuffle.partitions=500");
然而在实际生产中运行我不知道唯一键的数量是多少。我希望这是自动管理的。请问有什么办法吗
谢谢
巴拉
我建议您使用 "repartition" 函数,然后将重新分区的文件注册为新临时文件 table 并进一步缓存它以加快处理速度。
val distinctValues = hiveContext.sql("select KEY from BigTbl").distinct().count() // find count distinct values
hiveContext.sql("select * from BigTbl DISTRIBUTE by KEY")
.repartition(distinctValues.toInt) // repartition to number of distinct values
.registerTempTable("NewBigTbl") // register the repartitioned table as another temp table
hiveContext.cacheTable("NewBigTbl") // cache the repartitioned table for improving query performance
如需进一步查询,请使用 "NewBigTbl"