【问题标题】:PySpark writing two dataframes to the same partition but separated by folderPySpark 将两个数据帧写入同一个分区但由文件夹分隔
【发布时间】:2020-07-13 10:47:52
【问题描述】:

我正在使用 Spark 将两个不同的数据帧写入同一个分区,但我希望它们由分区末尾的文件夹分隔。即第一个数据帧将写入yyyy/mm/dd/,第二个数据帧将写入yyyy/mm/dd/rejected/

目前,我可以使用以下代码将第一个数据帧写入yyyy/mm/dd/,将第二个数据帧写入rejected/yyyy/mm/dd

  first_df.repartition('year', 'month', 'day').write \
    .partitionBy('year', 'month', 'day') \
    .mode("append") \
    .csv(f"{output_path}/")

  second_df.repartition('year', 'month', 'day').write \
    .partitionBy('year', 'month', 'day') \
    .mode("append") \
    .csv(f"{output_path}/rejected")

任何建议表示赞赏

【问题讨论】:

    标签: apache-spark pyspark apache-spark-sql pyspark-dataframes


    【解决方案1】:

    rejected 作为文字值添加到 second_df 然后包含在 partitionBy 中,即

    second_df.withColumn("rej",lit("rejected")) \
        .repartition('year', 'month', 'day').write \
        .partitionBy('year', 'month', 'day','rej') \
        .mode("append") \
        .csv(f"{output_path}")
    

    其他方式是使用hadoop file api 将文件移动到受尊重的目录中。

    Update:

    Rename the directory:

    URI           = sc._gateway.jvm.java.net.URI
    Path          = sc._gateway.jvm.org.apache.hadoop.fs.Path
    FileSystem    = sc._gateway.jvm.org.apache.hadoop.fs.FileSystem
    Configuration = sc._gateway.jvm.org.apache.hadoop.conf.Configuration
        
    fs = FileSystem.get(URI("hdfs://<name_node>:8020"), Configuration())
    #rename the directory
    fs.rename(Path(f'{output_path}/rej=rejected'),Path(f'{output_path}/rejected'))
    

    【讨论】:

    • 这工作并输出文件夹rej=rejected中的文件。有没有办法让文件夹命名为rejected
    • @AaronZhong,您可以重命名目录,请查看更新后的答案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-24
    • 2023-04-03
    • 2018-03-21
    • 1970-01-01
    相关资源
    最近更新 更多