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
- 在将数据写入磁盘时改进压缩
- 基于内存分区的
- 为了在磁盘上正确地写入数据,您几乎总是需要首先在内存中重新分区数据
- 方法,该方法指定是否应将数据写入文件夹中的磁盘。默认情况下,Spark不会将数据写入嵌套文件夹中的磁盘
- 磁盘级分区
输入行-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")