Scala 有没有办法将拼花地板分区下的所有文件读取到单个spark分区上?
数据以拼花格式存储。拼花地板文件根据分区键列(用户id列的哈希值)进行分区 根据分区方案,我们知道:Scala 有没有办法将拼花地板分区下的所有文件读取到单个spark分区上?,scala,apache-spark,partitioning,parquet,Scala,Apache Spark,Partitioning,Parquet,数据以拼花格式存储。拼花地板文件根据分区键列(用户id列的哈希值)进行分区 根据分区方案,我们知道: 给定用户的所有数据都属于同一分区 一个分区可以有1个以上的用户数据 在读取数据时,我希望1个用户的所有数据都落在同一个spark分区中。单个spark分区可以有多个用户,但它应该拥有所有这些用户的所有行 目前,我使用的是: SparkSession.read.parquet(“../userData”).repartition(200,col(“UserId”)) (还使用自定义分区器尝试了分区
有没有办法避免重新分区并利用输入文件夹结构将用户的数据放在单个分区上?
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进行分区
您想做什么?您的问题似乎是“我可以通过让spark重新划分数据来避免重新划分吗”。。。?在读取数据时无法实现所需的功能。如果您希望在读取数据时以某种方式对数据进行分区,则必须在磁盘上以这种方式对数据进行分区。分区是否可以包含每个用户超过1行?当我将拼花读入数据帧时,df.rdd.getNumPartitions
返回4(物理***.parquet的数量)而不是3(用户数量)这就是我希望实现的,这是因为你的机器上有3个以上的内核,每行可以由一个单独的内核处理。如果您的计算机上有3个内核,那么使用分区发现,两个文件的UserId=1
内容将放在同一个分区中。
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