有没有一种方法可以将Parquet地板分区下的所有文件读取到单个spark分区上?

uoifb46i  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(302)

数据以Parquet格式存储。Parquet文件是根据分区键列(user id列的散列值)进行分区的

userData/
    partitionKey=1/
        part-00044-cf737804-90ea-4c37-94f8-9aa016f6953a.c000.snappy.parquet
        part-00044-cf737804-90ea-4c37-94f8-9aa016f6953b.c000.snappy.parquet
    partitionKey=2/
        part-00059-cf737804-90ea-4c37-94f8-9aa016f6953a.c000.snappy.parquet
    partitionKey=3/
        part-00002-cf737804-90ea-4c37-94f8-9aa016f6953a.c000.snappy.parquet

根据分区方案,我们知道:
给定用户的所有数据都属于同一分区
一个分区可以有多个用户的数据
在读取数据时,我希望一个用户的所有数据都落在同一个spark分区中。单个spark分区可以有1个以上的用户,但它应该有所有这些用户的所有行。
目前,我使用的是:sparksession.read.parquet(“../userdata”).repartition(200,col(“userid”))
(也尝试与自定义分区;操作顺序:dataframe->rdd->keyedrd->partitionby->rdd->dataframe;在partitionby之前,有一个反序列化到对象的步骤,它会分解无序写入)
有没有办法避免重新分区并利用输入文件夹结构将用户的数据放在单个分区上?

dgiusagp

dgiusagp1#

SparkSession.read.parquet 应该根据文件路径自动推断分区信息。你可以在这里找到更多信息
如果文件路径是:

userData/
    UserId=1/
        part-00044-cf737804-90ea-4c37-94f8-9aa016f6953a.c000.snappy.parquet
        part-00044-cf737804-90ea-4c37-94f8-9aa016f6953b.c000.snappy.parquet
    UserId=2/
        part-00059-cf737804-90ea-4c37-94f8-9aa016f6953a.c000.snappy.parquet
    UserId=3/
        part-00002-cf737804-90ea-4c37-94f8-9aa016f6953a.c000.snappy.parquet

当你调用 SparkSession.read.parquet("/path/to/userData") ,它将按 UserId .

相关问题