使用动态分区overwritemode将Dataframe写入hdfs上的parquet,该hdfs由多个列进行分区

n3h0vuf2  于 2021-05-27  发布在  Hadoop
关注(0)|答案(0)|浏览(493)

我有一个Dataframe,我想以Parquet格式保存到hdfs。我想把它分成多列。
当我将数据写入hdfs目录本身时,只创建了其中的成功文件,但没有数据。我用 partitionOverwriteMode=dynamic 以及 overwrite 作为保存模式。当我执行代码时,路径不存在。如果我把保存模式改为 append 那就行了。我还尝试写入本地文件系统。在这种情况下,两种模式都能正常工作。如果只指定了一个分区列,那么它也可以正常工作。
关于如何使用多列分区进行覆盖,有什么想法吗?谢谢你给我小费。谢谢!
代码示例:

from pyspark.sql import SparkSession
from pyspark.conf import SparkConf

data = [
    {'country': 'DE', 'fk_imported_at': '20191212', 'user_id': 15},
    {'country': 'DE', 'fk_imported_at': '20191212', 'user_id': 14},
    {'country': 'US', 'fk_imported_at': '20191212', 'user_id': 12},
    {'country': 'US', 'fk_imported_at': '20191212', 'user_id': 13},
    {'country': 'DE', 'fk_imported_at': '20191213', 'user_id': 4},
    {'country': 'DE', 'fk_imported_at': '20191213', 'user_id': 2},
    {'country': 'US', 'fk_imported_at': '20191213', 'user_id': 1},
]

if __name__ == '__main__':
    conf = SparkConf()
    conf.set('spark.sql.sources.partitionOverwriteMode', 'dynamic')

    spark = (
        SparkSession
        .builder
        .config(conf=conf)
        .appName('test partitioning')
        .enableHiveSupport()
        .getOrCreate()
    )

    df = spark.createDataFrame(data)
    df.show()
    df.repartition(1).write.parquet('/tmp/spark_save_mode', 'overwrite', ['fk_imported_at', 'country'])

    spark.stop()

我正在以客户端模式提交申请。spark版本是2.3.0。hadoop版本是2.6.0

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题