我正在使用 Spark 读取具有 2 个分区的镶木地板文件,以便应用一些处理,让我们以这个例子
├── Users_data
│ ├── region=eu
├── country=france
├─- fr_default_players_results.parquet
│ ├── region=na
├── country=us
├── us_default_players_results.parquet
当用
fr_default_players_results.parquet
写回镶木地板时,有没有办法保留相同的文件名(在本例中为us_default_players_results.parquet
,df.write()
)?
不,不幸的是你不能用spark决定文件名,因为它们是自动生成的,但是你可以做的是创建一个包含文件名的列,然后按该列分区,这将创建一个包含文件名的目录并在其中Spark生成的文件:
df.withColumn("file_name", regexp_extract(input_file_name(), "[^/]*$", 0)).write.partitionBy("region", "country", "file_name").parquet("path/Users_data")
这将创建这棵树:
├── Users_data
│ ├── region=eu
├── country=france
├─- file_name=fr_default_players_results.parquet
├──part-00...c000.snappy.parquet
│ ├── region=na
├── country=us
├── file_name=us_default_players_results.parquet
├──part-00...c000.snappy.parquet
如果您想更进一步并真正更改名称,那么您可以使用 hadoop 库循环文件,将它们复制到父路径并使用 Spark file_name=....parquet 生成的文件夹名称重命名它们,然后删除文件夹