[ https://issues.apache.org/jira/browse/SPARK-37194?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
XiDuo You updated SPARK-37194: ------------------------------ Description: `FileFormatWriter.write` will sort the partition and bucket column before writing. I think this code path assumed the input `partitionColumns` are dynamic but actually it's not. It now is used by three code path: - `FileStreamSink`; it should be always dynamic partition - `SaveAsHiveFile`; it followed the assuming that `InsertIntoHiveTable` has removed the static partition and `InsertIntoHiveDirCommand` has no partition - `InsertIntoHadoopFsRelationCommand`; it passed `partitionColumns` into `FileFormatWriter.write` without removing static partition because we need it to generate the partition path in `DynamicPartitionDataWriter` It shows that the unnecessary sort only affected the `InsertIntoHadoopFsRelationCommand` if we write data with static partition. Do a simple benchmak: {code:java} CREATE TABLE test (id long) USING PARQUET PARTITIONED BY (d string); -- before this PR, it tooks 1.82 seconds -- after this PR, it tooks 1.072 seconds INSERT OVERWRITE TABLE test PARTITION(d='a') SELECT id FROM range(10000000); {code} was: `FileFormatWriter.write` will sort the partition and bucket column before do writing. I think this code path assumed the input `partitionColumns` are dynamic but actually it's not. It now is used by three code path: - `FileStreamSink`; it should be always dynamic partition - `SaveAsHiveFile`; it followed the assuming that `InsertIntoHiveTable` has removed the static partition and `InsertIntoHiveDirCommand` has no partition - `InsertIntoHadoopFsRelationCommand`; it passed `partitionColumns` into `FileFormatWriter.write` without removing static partition because we need it to generate the partition path in `DynamicPartitionDataWriter` It shows that the unnecessary sort only affected the `InsertIntoHadoopFsRelationCommand` if we write data with static partition. Do a simple benchmak: {code:java} CREATE TABLE test (id long) USING PARQUET PARTITIONED BY (d string); -- before this PR, it tooks 1.82 seconds -- after this PR, it tooks 1.072 seconds INSERT OVERWRITE TABLE test PARTITION(d='a') SELECT id FROM range(10000000); {code} > Avoid unnecessary sort in FileFormatWriter if it's not dynamic partition > ------------------------------------------------------------------------ > > Key: SPARK-37194 > URL: https://issues.apache.org/jira/browse/SPARK-37194 > Project: Spark > Issue Type: Improvement > Components: SQL > Affects Versions: 3.3.0 > Reporter: XiDuo You > Priority: Major > > `FileFormatWriter.write` will sort the partition and bucket column before > writing. I think this code path assumed the input `partitionColumns` are > dynamic but actually it's not. It now is used by three code path: > - `FileStreamSink`; it should be always dynamic partition > - `SaveAsHiveFile`; it followed the assuming that `InsertIntoHiveTable` has > removed the static partition and `InsertIntoHiveDirCommand` has no partition > - `InsertIntoHadoopFsRelationCommand`; it passed `partitionColumns` into > `FileFormatWriter.write` without removing static partition because we need it > to generate the partition path in `DynamicPartitionDataWriter` > It shows that the unnecessary sort only affected the > `InsertIntoHadoopFsRelationCommand` if we write data with static partition. > > Do a simple benchmak: > {code:java} > CREATE TABLE test (id long) USING PARQUET PARTITIONED BY (d string); > -- before this PR, it tooks 1.82 seconds > -- after this PR, it tooks 1.072 seconds > INSERT OVERWRITE TABLE test PARTITION(d='a') SELECT id FROM range(10000000); > {code} -- This message was sent by Atlassian Jira (v8.3.4#803005) --------------------------------------------------------------------- To unsubscribe, e-mail: issues-unsubscr...@spark.apache.org For additional commands, e-mail: issues-h...@spark.apache.org