Apache spark 将数据集分区与表分区方案对齐
我正在给一张按月分区的桌子写信。我知道我的数据是≈每个分区100MB,没有扭曲-它将适合单个HDFS块,我希望确保每个分区都写入一个文件。我还知道数据集中的确切月数(介于1和10之间),因此:Apache spark 将数据集分区与表分区方案对齐,apache-spark,partitioning,Apache Spark,Partitioning,我正在给一张按月分区的桌子写信。我知道我的数据是≈每个分区100MB,没有扭曲-它将适合单个HDFS块,我希望确保每个分区都写入一个文件。我还知道数据集中的确切月数(介于1和10之间),因此: ds.repartition(nMonths, $"month").write.<options>.insertInto(<...>) ds.repartition(nMonths,$“month”).write..insertInto() 这很有效。然而我从这里开始思考。。。
ds.repartition(nMonths, $"month").write.<options>.insertInto(<...>)
ds.repartition(nMonths,$“month”).write..insertInto()
这很有效。然而我从这里开始思考。。。由于Spark使用key的散列来确定分区,我不能保证每个分区都会收到一个月的数据。我拥有的分区越多,这种情况就越不可能发生-对吗
那么,将分区数增加到不同键数之上有意义吗
ds.repartition(nMonths * 3, $"month").write.<options>.insertInto(<...>)
ds.repartition(nMonths*3,$“月”).write..insertInto()
很多分区都是空的,但这应该不会太痛苦(应该吗?),我们正在降低一些不走运的分区获得3/4倍数据的概率,从而增加总体执行时间。这有意义吗?关于这个因素有什么经验法则吗?或者任何其他方法来达到同样的效果?如果您想要超级安全,您可以使用以下方法:
ds.repartitionByRange(nMonths,$"month").write...
通过这种方式,您也不会有空分区,这反过来意味着您也不会在HDFS中生成零大小的文件。酷,我很惊讶地看到它还能很好地处理像201907..202006这样的范围(从
Int
的角度来看,这里有一个201913..201999的间隙)。