Spark.sql.files.maxPartitionBytes 不限制写入分区的最大大小

roo*_*ign 3 apache-spark apache-spark-sql aws-glue

我正在尝试将镶木地板数据从另一个 s3 存储桶复制到我的 s3 存储桶。我想将每个分区的大小限制为最大 128 MB。我认为默认情况下,spark.sql.files.maxPartitionBytes会设置为 128 MB,但是当我在复制后查看 s3 中的分区文件时,我看到单个分区文件大约为 226 MB。我正在看这篇文章,建议我设置此 Spark 配置键以限制分区的最大大小:Limiting max size of dataframe partition但它似乎不起作用?

这是该配置键的定义:

读取文件时打包到单个分区中的最大字节数。此配置仅在使用基于文件的源(例如 Parquet、JSON 和 ORC)时有效。

我也有点困惑这与写入的镶木地板文件的大小有何关系。

作为参考,我在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/")
Run Code Online (Sandbox Code Playgroud)

Dav*_*rba 10

该设置spark.sql.files.maxPartitionBytes确实会影响在 Spark 集群上读取数据时分区的最大大小。如果输出后的最终文件太大,那么我建议减小此设置的值,它应该创建更多文件,因为输入数据将分布在更多分区中。但是,如果您的查询中有任何随机播放,则情况并非如此,因为它将始终重新分区为spark.sql.shuffle.partitions设置给定的分区数。

此外,文件的最终大小将取决于您将使用的文件格式和压缩方式。因此,如果将数据输出到 parquet 等文件中,文件将比输出到 csv 或 json 小得多。