Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 如何按键重新分区RDD,然后将其打包到碎片?_Apache Spark_Pyspark_Pytorch - Fatal编程技术网

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组对于单个分区是唯一的。