Apache spark Spark:repartitionByRange创建多个文件

Apache spark Spark:repartitionByRange创建多个文件,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我正在将数据写入拼花地板文件,如下所示- df.repartitionByRange($"key", rand) .write .option("maxRecordsPerFile", 5000) .partitionBy("key") .parquet("somelocation") 我使用了一个字符串列(键)进行分区,这是一个城市,因为我有更多基于它的过滤器 即使指定了maxRecordsPer

我正在将数据写入拼花地板文件,如下所示-

df.repartitionByRange($"key", rand)
  .write
  .option("maxRecordsPerFile", 5000)
  .partitionBy("key")
  .parquet("somelocation")
我使用了一个字符串列(键)进行分区,这是一个城市,因为我有更多基于它的过滤器


即使指定了
maxRecordsPerFile
,也会在一个分区文件夹中创建多个小文件(数十条或数百条记录)。

AFAIK,下面的用例可能有助于解决您的问题

术语:

1。maxRecordsPerFile-限制每个文件写入的最大记录数

2。重新分区按范围(10,$“id”)

  • repartitionByRange(numPartitions:Int,partitionExprs:Column*)
  • 它将通过将partitionexpr拆分为partitionexpr/numPartitions equal记录拆分来创建numPartitions
  • 在将数据写入磁盘时改进压缩
  • 基于内存分区的
  • 为了在磁盘上正确地写入数据,您几乎总是需要首先在内存中重新分区数据
3。partitionedBy(“您想要写入的目录”)

  • 方法,该方法指定是否应将数据写入文件夹中的磁盘。默认情况下,Spark不会将数据写入嵌套文件夹中的磁盘
  • 磁盘级分区
案例1:
输入行-1000
重新分区-10
,maxRecordsPerFile=inputrows/repartitioncount<代码>1000/10=100。在磁盘级分区目录(
partition=1
)中,导致
10 part-xxxxx
文件具有相同数量的记录(
100条记录)

案例2:
输入行-1000
重新分区-10
,maxRecordsPerFile>输入行/重新分区计数<代码>1000
。在磁盘级分区目录(
partition=1
)中,同样会导致
10个part-xxxxx文件
,具有相同数量的记录(
100条记录)


案例3:
输入行-1000
重新分区-10
,输入的maxRecordsPerFileformat和输出的格式,请提供更多信息?@smart_coder我正在读取拼花地板文件的数据帧,并使用拼花地板格式分区存储相同的数据。您能用提供的分区列更新问题吗?嗯。。。。那是什么语言?我的意思是,我认为在大多数语言中,重新分区签名是
重新分区(numPartitions:Int,partitionExprs:Column*):Dataset[T]
。以
$“key”
作为第一个参数看起来不太合适,不是吗?我认为@mazaneicha评论非常相关,谢谢你的解释!!在我接受答案之前,请您解释一下partitionBy列和repartitionByRange列都相同的情况。。在我的问题中,它是键列。如果我在repartitionByRange中添加random作为partitionExpression的一部分,会怎么样?
import org.apache.spark.sql.functions.{col, lit, when}
val df=spark.range(1000)
val df1=df.withColumn("partitioncol",lit("1"))

df1.repartitionByRange(10, $"id").write.option("maxRecordsPerFile", 100).partitionBy("partitioncol").parquet("/FileStore/import-stage/all4")
import org.apache.spark.sql.functions.{col, lit, when}
val df=spark.range(1000)
val df1=df.withColumn("partitioncol",lit("1"))

df1.repartitionByRange(10, $"id").write.option("maxRecordsPerFile", 1000).partitionBy("partitioncol").parquet("/FileStore/import-stage/all4")
import org.apache.spark.sql.functions.{col, lit, when}
val df=spark.range(1000)
val df1=df.withColumn("partitioncol",lit("1"))

df1.repartitionByRange(10, $"id").write.option("maxRecordsPerFile", 10).partitionBy("partitioncol").parquet("/FileStore/import-stage/all4")