spark.sql.files.maxpartitionbytes不限制已写入分区的最大大小

wr98u20j  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(1554)

我正在尝试将Parquet数据从另一个s3桶复制到我的s3桶。我想将每个分区的大小限制为最大128MB。我原以为默认情况下spark.sql.files.maxpartitionbytes会设置为128MB,但当我在复制后查看s3中的分区文件时,我看到的是226MB左右的单个分区文件。我在看这篇文章,它建议我设置这个spark config键来限制分区的最大大小:限制Dataframe分区的最大大小,但它似乎不起作用?
这是配置键的定义:
读取文件时要打包到单个分区中的最大字节数。此配置仅在使用基于文件的源(如parquet、json和orc)时有效。
我也有点搞不清楚这和写的Parquet文件的大小有什么关系。
作为参考,我正在glue版本1.0、spark 2.4上运行一个glue脚本,脚本如下:

val conf: SparkConf = new SparkConf()
conf.set("spark.sql.catalogImplementation", "hive")
    .set("spark.hadoop.hive.metastore.glue.catalogid", catalogId)
val spark: SparkContext = new SparkContext(sparkConf)

val glueContext: GlueContext = new GlueContext(spark)
val sparkSession = glueContext.getSparkSession

val sqlDF = sparkSession.sql("SELECT * FROM db.table where id='item1'")
sqlDF.write.mode(SaveMode.Overwrite).parquet("s3://my-s3-location/")
slwdgvem

slwdgvem1#

设置 spark.sql.files.maxPartitionBytes 在读取spark集群上的数据时,确实会影响分区的最大大小。如果输出后的最终文件太大,那么我建议降低此设置的值,它应该创建更多的文件,因为输入数据将分布在更多的分区中。但是,如果查询中有任何无序处理,则这将不是真的,因为这样它将始终被重新分区到 spark.sql.shuffle.partitions 设置。
此外,文件的最终大小将取决于您将使用的文件格式和压缩。因此,如果您将数据输出到例如parquet中,文件将比输出到csv或json小得多。

相关问题