在 PySpark 中保留 parquet 文件名

问题描述 投票:0回答:1

我正在使用 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()
)?

apache-spark pyspark apache-spark-sql databricks parquet
1个回答
3
投票

不,不幸的是你不能用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 生成的文件夹名称重命名它们,然后删除文件夹

© www.soinside.com 2019 - 2024. All rights reserved.