首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用spark数据帧写入时自动计算numRepartition

问如何在使用spark数据帧写入时自动计算numRepartition
EN

Stack Overflow用户
提问于 2018-08-13 11:02:27
回答 2查看 279关注 0票数 1

当我尝试将dataframe写入Hive拼接分区表时

代码语言:javascript
复制
df.write.partitionBy("key").mode("append").format("hive").saveAsTable("db.table")

它会在HDFS中创建大量的块,每个块只有很小的数据量。

我理解它是如何进行的,因为每个spark子任务都会创建一个块,然后向其中写入数据。

我也理解,块的数量会提高Hadoop的性能,但达到阈值后也会降低性能。

如果我想自动设置numPartition,有没有人有好主意?

代码语言:javascript
复制
numPartition = ??? // auto calc basing on df size or something
df.repartition("numPartition").write
  .partitionBy("key")
  .format("hive")
  .saveAsTable("db.table")
EN

回答 2

Stack Overflow用户

发布于 2020-05-11 04:32:05

首先,当您已经在使用partitionBy(key)时,为什么还要有一个额外的重新分区步骤-您的数据将根据键进行分区。

通常,您可以按列值重新分区,这是一个常见的场景,有助于reduceByKey、基于列值的过滤等操作。例如,

代码语言:javascript
复制
val birthYears = List(
  (2000, "name1"),
  (2000, "name2"),
  (2001, "name3"),
  (2000, "name4"),
  (2001, "name5")
)
val df = birthYears.toDF("year", "name")

df.repartition($"year") 
票数 0
EN

Stack Overflow用户

发布于 2018-08-13 16:37:16

默认情况下,spark将为随机操作创建200个分区。因此,200个文件/块(如果文件大小较小)将写入HDFS。

根据您在Spark中的数据配置shuffle后要创建的分区数量,使用以下配置:

代码语言:javascript
复制
spark.conf.set("spark.sql.shuffle.partitions", <Number of paritions>)

例如:spark.conf.set("spark.sql.shuffle.partitions", "5"),所以Spark将创建5个分区,并将5个文件写入HDFS。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51814680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档