Apache spark 如何按键重新分区RDD,然后将其打包到碎片?
我有许多文件包含数百万行的格式:Apache spark 如何按键重新分区RDD,然后将其打包到碎片?,apache-spark,pyspark,pytorch,Apache Spark,Pyspark,Pytorch,我有许多文件包含数百万行的格式: id, created_date, some_value_a, some_value_b, some_value_c 这种重新分区的方式非常慢,为我创建了超过百万个~500b的小文件: rdd_df = rdd.toDF(["id", "created_time", "a", "b", "c"]) rdd_df.write.partitionBy
id, created_date, some_value_a, some_value_b, some_value_c
这种重新分区的方式非常慢,为我创建了超过百万个~500b的小文件:
rdd_df = rdd.toDF(["id", "created_time", "a", "b", "c"])
rdd_df.write.partitionBy("id").csv("output")
我想实现输出文件,其中每个文件包含10000个唯一ID及其所有行
我如何才能实现这样的目标?您需要这样的目标:
rdd_df.repartition(*number of partitions you want*).write.csv("output", header = True)
或者老实说,让作业决定分区的数量,而不是重新分区。理论上,这应该更快:
rdd_df.write.csv("output", header = True)
你需要这样的东西:
rdd_df.repartition(*number of partitions you want*).write.csv("output", header = True)
或者老实说,让作业决定分区的数量,而不是重新分区。理论上,这应该更快:
rdd_df.write.csv("output", header = True)
您可以通过添加随机Salt密钥来重新分区
val totRows = rdd_df.count
val maxRowsForAnId = rdd_df.groupBy("id").count().agg(max("count"))
val numParts1 = totRows/maxRowsForAnId
val totalUniqueIds = rdd_df.select("id").distinct.count
val numParts2 = totRows/(10000*totalUniqueIds)
val numPart = numParts1.min(numParts2)
rdd_df
.repartition(numPart,col("id"),rand)
.csv("output")
主要概念是每个分区将被写为一个文件
。因此,您必须通过重新分区(numPart,col(“id”),rand)
将所需的行放入1个分区
前4-5个操作只是计算每个文件需要多少个分区才能获得近10000个ID
- 假设每个分区有10000个ID进行计算
- 角落案例:如果单个
的行太多,并且不适合上面计算的分区大小id
- 因此,我们根据出现的ID的最大计数来计算分区数
- 以两个noOfPartitons中的最小值为例
rand
是必需的,这样我们就可以在一个分区中引入多个ID
注意:尽管这会给您提供更大的文件,而且每个文件肯定会包含一组唯一的ID。但这涉及到洗牌,因此您的操作实际上可能比您提到的代码慢。您可以通过添加随机Salt密钥来重新分区
val totRows = rdd_df.count
val maxRowsForAnId = rdd_df.groupBy("id").count().agg(max("count"))
val numParts1 = totRows/maxRowsForAnId
val totalUniqueIds = rdd_df.select("id").distinct.count
val numParts2 = totRows/(10000*totalUniqueIds)
val numPart = numParts1.min(numParts2)
rdd_df
.repartition(numPart,col("id"),rand)
.csv("output")
主要概念是每个分区将被写为一个文件
。因此,您必须通过重新分区(numPart,col(“id”),rand)
将所需的行放入1个分区
前4-5个操作只是计算每个文件需要多少个分区才能获得近10000个ID
- 假设每个分区有10000个ID进行计算
- 角落案例:如果单个
的行太多,并且不适合上面计算的分区大小id
- 因此,我们根据出现的ID的最大计数来计算分区数
- 以两个noOfPartitons中的最小值为例
rand
是必需的,这样我们就可以在一个分区中引入多个ID
注意:尽管这会给您提供更大的文件,而且每个文件肯定会包含一组唯一的ID。但这涉及到洗牌,因此您的操作实际上可能比您提到的代码慢。还有其他方法-1。将其作为一个表编写,然后在重写它们之前使用ZorderBy优化该表。但您提供的两种方法都不包括按键分组。我希望ID组对于单个分区是唯一的。还有其他方法-1。将其作为一个表编写,然后在重写它们之前使用ZorderBy优化该表。但您提供的两种方法都不包括按键分组。我希望ID组对于单个分区是唯一的。