数据以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之前,有一个反序列化到对象的步骤,它会分解无序写入)
有没有办法避免重新分区并利用输入文件夹结构将用户的数据放在单个分区上?
1条答案
按热度按时间dgiusagp1#
SparkSession.read.parquet
应该根据文件路径自动推断分区信息。你可以在这里找到更多信息如果文件路径是:
当你调用
SparkSession.read.parquet("/path/to/userData")
,它将按UserId
.