spark按键分组和数据分区

wwwo4jvm  于 2021-05-19  发布在  Spark
关注(0)|答案(1)|浏览(471)

我有一个大的csv文件,数据格式如下。
城市1,姓名,地址,邮编
城市2,姓名,地址,…,邮编
城市1,姓名,地址,邮编
........
城市DN,姓名,地址,…,邮编
我正在对上述csv文件执行以下操作:
按cityid分组作为键,按资源列表作为值
df1.groupby($“cityid”).agg(collect\u list(struct(cols.head,cols.tail:\作为“资源”)
把它改成jsonrdd
val jsondatardd2=df2.tojson.rdd
遍历每个分区并按每个键上载到s3
由于业务逻辑限制(其他服务如何从s3读取),我不能使用dataframe partitionby write
我的问题:
spark分区的默认大小是多少?
假设分区的默认大小是xmbs,并且在dataframe中存在一个大记录,其中key有ymbs的数据(y>x),在这种情况下会发生什么?
在这种情况下,我需要担心在不同的分区中有相同的密钥吗?

idfiyjo8

idfiyjo81#

回答您的问题:
从辅助存储(s3、hdfs)读取时,分区等于文件系统的块大小,128mb或256mb;但是您可以立即重新划分RDD,而不是Dataframe(对于jdbc和spark结构化流媒体,分区的大小是动态的。)
当应用“广泛转换”和重新分区时,分区的数量和大小很可能会改变。给定分区的大小有一个最大值。在spark 2.4.x中,分区大小增加到8gb。因此,如果任何转换(例如collect\u list与groupby组合)的gens超过这个最大值,您将得到一个错误,程序将中止。因此,您需要明智地进行分区,或者在您的情况下有足够数量的分区进行聚合—请参阅spark.sql.shuffle.partitions参数。
spark处理的并行模型依赖于通过散列、范围分区等分配的“密钥”被分配到一个且只有一个分区-洗牌。所以,遍历一个分区foreachpartition,mappartitions没有问题。

相关问题