当前位置: 首页 > 知识库问答 >
问题:

如何在 Spark scala 中的倾斜列上对数据帧进行重新分区?

楚健
2023-03-14

我有一个数据帧,它有500个分区,并且被洗牌。我想根据“城市”一栏重新划分,但城市一栏非常歪斜,因为它只有三个可能的值。所以当我重新分区​ 基于列城市,即使我指定了500个分区,也只有三个分区在获取数据。因此,我遇到了性能问题。我在网上搜索,但找不到任何合适的解决方案。是否有一种方法可以跨基于city列的分区均匀地重新划分数据帧。我需要的是:city1表示前5个分区,city2表示后490个分区,而city3表示剩余的5个分区。

共有3个答案

国兴贤
2023-03-14

在数据框上使用DISTRIBUTE BY子句。

根据您的要求,为了处理倾斜,您可以使用 Distribution By 重新分区数据。

对于作为分区依据的表达式,选择一个您知道可以均匀分布数据的表达式。

df.distributeBy($'<expression>', 30)

表达式中,可以使用一些表达式(如city.toString().length)对结果进行随机化

温浩大
2023-03-14

您可以通过指定一个或多个列(在本例中为2)来将分区重新划分为500个分区。例如(pyspark):

file_x = "hdfs://mycluster/user/data/x"
df_x = sq.read.format("com.databricks.spark.avro").load(file_x)

print str(datetime.now()) + ": FileX partitions: " + str(df_x.rdd.getNumPartitions())

# repartition based on 2 columns
df_y = df_x.repartition(500, "CITY", "ADDRESS")

print str(datetime.now()) + ": FileY partitions: " + str(df_y.rdd.getNumPartitions())

查看文档了解更多

蒋培
2023-03-14

当我们遇到已知歪斜的数据时,我们使用了一个分区器,该分区器对歪斜的值应用受控随机化。我在这个答案中概述了如何做到这一点。

 类似资料:
  • 我有一个pandas数据帧像: 我想按第一列进行分组,并将第二列作为行中的列表:

  • 我想按多个列对熊猫数据框进行分组。每个Row都有一个整数、一个Name和一个额外的数值。我希望最终的Dataframe包含Name具有最高整数的每一行。 通过分组数据帧,只有第0行应该消失。第3行和第4行仍应包括在数据框中。

  • 使用Spark Dataset/DataFrame联接时,我面临长时间运行且OOM作业失败的问题。 以下是输入: ~10个不同大小的数据集,大部分是巨大的( 经过一番分析,我发现作业失败和缓慢的原因是歪斜键:当左侧有数百万条记录时,用连接键。 我用了一些蛮力的方法来解决这个问题,这里我想和大家分享一下。 如果您有更好的或任何内置的解决方案(针对常规Apache Spark),请与他人分享。

  • 我正在编写一个Python脚本来从我的数码相机导入图片,并且我正在使用Pandas来帮助记账传入的图像。我正在使用EXIF数据为单个图像标记信息,例如相机型号、图像模式、图像格式和相机获取图像的时间戳。这些数据用于将图像分离到目录结构中。我正在努力解决的是如何使用Pandas根据一组时间戳对图像进行分组,例如,这些时间戳都在彼此相隔半小时之内。举个例子,假设我有六张照片,其中三张是在相隔9分钟内拍

  • 例如,我有一个很大的字流,想要数每一个字。问题是这些话是歪斜的。这意味着某些词的使用频率会很高,而其他大多数词的使用频率却很低。在storm中,我们可以使用以下方法来解决这个问题。首先对流进行洗牌分组,在每个节点的一个窗口时间内计数本地字,最后更新计数到累积结果。从我的另一个问题中,我知道Flink只支持键控流上的window,否则window操作不会并行。 我的问题是在Flink中有没有一个好的

  • 我有一个像这样的数据框- 我有一个这样的列表- 现在,我想根据列名列表对数据框进行排序 因此,新的数据框将有列名称-