Databricks Dataframe 在单独的目录中为每个写入文件创建多个文件。仅需要 1 个文件 .parquet 或 .csv

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

我需要一些帮助来从数据帧创建镶木地板文件,因为写入时会在单独的目录中创建多个文件: Databricks Python 代码:

mounted_directory_path = "/mnt/myContainer/MyFolder/"
file_list = dbutils.fs.ls(mounted_directory_path)   
    
def insertFirstLineInFile(file_path):
    try:
        header =    ["Model" , "SerialNumber" .....]
        my_df = spark.read.format("csv").option("inferSchema","false").option("sep",",").option("header","false").load(file_path)
        my_df = my_df.toDF(*header)
    
    
        # Extract the filename from file_info.path
        filename = os.path.basename(file_path)
        # rename original filename .csv to .parquet
        if filename.endswith(".csv"): 
            # Replace ".csv" with ".parquet"
            filename = filename[:-4] + ".parquet"
        
        OutputFile = OutputDirectory + filename
        print("Filename:", OutputFile)
        # partition to single file
        my_df_single_partition = my_df.coalesce(1)
        my_df_single_partition.write.option("header", "true").parquet(OutputFile)
        
    except Exception as e:
                print(f"Error reading {file_path}: {str(e)}")

for file_info in file_list:
   insertFirstLineInFile(file_info.path)

有没有一种更干净的方法,而不是复制并重命名 .parquet、上移一级并删除包含 4 个文件的文件夹。

非常感谢您的帮助。

databricks azure-databricks parquet
1个回答
0
投票

通常不建议更改或删除由 DBIO 事务协议创建的那些文件,如 @funmatters 提到的。

但是,您可以通过关闭此处回答的多个设置来防止创建这些内容:https://community.databricks.com/t5/data-engineering/how-do-i-prevent-success-and-comfilled-文件在我的写入输出/td-p/28690

  1. 我们可以使用
    spark.sql.sources.commitProtocolClass=org.apache.spark.sql.execution.datasources.SQLHadoopMapReduceCommitProtocol
    禁用spark parquet write的事务日志。这将有助于禁用“已提交”和“已启动”文件,但仍会生成 _SUCCESS、_common_metadata 和 _metadata 文件。
  2. 我们可以使用
    parquet.enable.summary-metadata=false
  3. 禁用 _common_metadata 和 _metadata 文件
  4. 我们还可以使用
    mapreduce.fileoutputcommitter.marksuccessfuljobs=false
  5. 禁用 _SUCCESS 文件
© www.soinside.com 2019 - 2024. All rights reserved.