### Description

Add the ability to partition parquet files by columns. Right now you can partition files only by size.

### Use case/motivation

_No response_

### Related issues

_No response_

### Are you willing to submit a PR?

- [X] Yes I am willing to submit a PR!

### Code of Conduct

- [x] I agree to follow this project's [Code of Conduct](https://github.com/apache/airflow/blob/main/CODE_OF_CONDUCT.md)

file_to_upload = {
            "file_name": self.filename.format(file_no),
            "file_handle": tmp_file_handle,
            "file_mime_type": file_mime_type,
            "file_row_count": 0,
        }
        if self.export_format == "csv":
            csv_writer = self._configure_csv_file(tmp_file_handle, schema)
        if self.export_format == "parquet":
            parquet_schema = self._convert_parquet_schema(cursor)
            parquet_writer = self._configure_parquet_file(tmp_file_handle, parquet_schema)
        for row in cursor:
            file_to_upload["file_row_count"] += 1
            if self.export_format == "csv":
                row = self.convert_types(schema, col_type_dict, row)
                if self.null_marker is not None:
                    row = [value if value is not None else self.null_marker for value in row]
                csv_writer.writerow(row)
            elif self.export_format == "parquet":
                row = self.convert_types(schema, col_type_dict, row)
                if self.null_marker is not None:
                    row = [value if value is not None else self.null_marker for value in row]
                row_pydic = {col: [value] for col, value in zip(schema, row)}
                tbl = pa.Table.from_pydict(row_pydic, parquet_schema)
                parquet_writer.write_table(tbl)
            else:
                row = self.convert_types(schema, col_type_dict, row)
                row_dict = dict(zip(schema, row))
                tmp_file_handle.write(
                    json.dumps(row_dict, sort_keys=True, ensure_ascii=False).encode("utf-8")