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

Spark 2.3数据帧分区想要在n个分区中的密钥上对数据进行分区

乐山
2023-03-14

我需要spark(scala)数据帧分区方面的帮助。我需要按一个键列划分成n个分区,与同一个键相关的所有行都应该在同一个分区中(即,键不应该分布在整个分区中)

注意:我的钥匙可能有几百万

例如:假设我有下面的数据框

等等等等

正如您所看到的,许多值共享相同的键。我想将此数据集划分为"n"个分区,其中相同的键应该在相同的分区中,并且键不应该分布在分区之间。多个键驾驶室位于同一分区,键不可排序。

提前谢谢

共有3个答案

能向晨
2023-03-14

尝试

def repartition(partitionExprs: org.apache.spark.sql.Column*): org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] 

val df = Seq(("aa","vv"),("aa","v1v1"),("a1","v2")).toDF("Key","Value")
 val partionedDf = df.repartition(col("Key"))

鄢开诚
2023-03-14

可以在将数据帧写入基于文件的输出时对其进行分区。比如:

df.write.partitionBy("colName").format("parquet").save(path-to-file)

这将创建目录结构

path
└── to
    └── file
         ├── colName=value1
                       └── data.parquet
         ├── colName=value2
                       └── data.parquet

当您加载数据和过滤器时,谓词将被下推到源文件中,您可以获得分区的性能优势

这不是你要找的吗?

赵才俊
2023-03-14

根据《Spark-the Definitive Guide》一书的介绍,Spark有两个内置的分区器,一个用于离散值的HashPartitioner和一个RangePartitioner。两者都适用于离散值和连续值。

HashPartitioner示例:

import org.apache.spark.HashPartitioner

val rdd = df.rdd // convert DataFrame to low-level RDD
val keyedRDD = rdd.keyBy(...) // define your custom key
keyedRDD.partitionBy(new HashPartitioner(n))

示例分区器:

scala prettyprint-override">import org.apache.spark.Partitioner

class DomainParitioner extends Partitioner {
  def numPartitions = n
  def getPartition(key: Any): Int = {
    // your custome partition logic
  }
}

keyedRDD.partitionBy(new DomainPartitioner).map(_._1).glom().map(_.toSet.toSeq.length)

书中还提到,您应该注意键歪斜,这意味着一些键可能比其他键具有更多的值。您希望尽可能地打破这些键,以提高并行性,并在执行过程中防止OutOfMemory错误。

 类似资料:
  • 有人能解释一下将为Spark Dataframe创建的分区数量吗。 我知道对于RDD,在创建它时,我们可以提到如下分区的数量。 但是对于创建时的Spark数据帧,看起来我们没有像RDD那样指定分区数量的选项。 我认为唯一的可能性是,在创建数据帧后,我们可以使用重新分区API。 有人能告诉我在创建数据帧时,我们是否可以指定分区的数量。

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

  • 我需要使用 spark-sql 加载一个 Hive 表,然后对其运行一些机器学习算法。我是这样写的: 它工作得很好,但如果我想增加数据集数据帧的分区数,我该怎么做?使用普通RDD,我可以写: 我想要有N个分区。 谢谢

  • Redisson 仅在集群模式中支持数据分区(分片)。 它使得可以使用整个 Redis 集群的内存而不是单个节点的内存来存储单个数据结构实例。 Redisson 默认将数据结构切分为 231 个槽。槽的数量可在 3 和 16834 之间。槽会一致地分布在所有的集群节点上。这意味着每个节点将包含近似相等数量的槽。如默认槽量(231) 和 4 个节点的情况,每个节点将包含接近 57 个数据分区,而对

  • spark如何在使用< code>orderBy后确定分区的数量?我一直以为生成的数据帧有< code > spark . SQL . shuffle . partitions ,但这似乎不是真的: 在这两种情况下,spark都< code >-Exchange range partitioning(I/n ASC NULLS FIRST,200),那么第二种情况下的分区数怎么会是2呢?

  • 我有一个大的csv文件,其中包含以下格式的数据。 CityId1,名称,地址,........., zip 城市2、姓名、地址等,。。。。。。。,拉链 CityId1,名称,地址,........., zip ......... 城市名称、姓名、地址等,。。。。。。。,拉链 我正在对上面的csv文件执行以下操作: > df1。groupBy($“cityId”)。agg(收集列表(结构(cols.