我用的是 Spark 2。
实际上我不是执行查询的人,所以我不能包含查询计划。数据科学团队问过我这个问题。
我们将 Hive 表划分为 2000 个分区并以 parquet 格式存储。当在 Spark 中使用相应的表时,执行器之间恰好执行了 2000 个任务。但我们的块大小为 256 MB,并且我们预计分区数量(总大小/256)肯定会远小于 2000。 Spark使用数据的物理结构来创建分区是否有任何内部逻辑?任何参考/帮助将不胜感激。
更新:事实恰恰相反。实际上我们的表非常大,有 3 TB,有 2000 个分区。 3TB/256MB 实际上会达到 11720,但我们的分区数量与表的物理分区数量完全相同。我只是想了解任务是如何在数据量上生成的。
一般来说,Hive 分区不会 1:1 映射到 Spark 分区。 1个Hive分区可以拆分为多个Spark分区,一个Spark分区可以容纳多个Hive分区。
加载 hive-table 时 Spark 分区的数量取决于以下参数:
spark.files.maxPartitionBytes (default 128MB)
spark.files.openCostInBytes (default 4MB)
您可以检查分区,例如使用
spark.table(yourtable).rdd.partitions
这会给你一个数组FilePartitions
其中包含文件的物理路径。
为什么你从 2000 个 Hive 分区中得到了 2000 个 Spark 分区,这对我来说似乎是巧合,根据我的经验,这种情况不太可能发生。请注意,spark 1.6 中的情况有所不同,spark 分区的数量类似于文件系统上的文件数量(1 个 Spark 分区对应 1 个文件,除非文件非常大)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)