Scala 如何基于列隔离分区?
我希望在Spark数据帧的单个分区内执行独立的工作。我希望在单个分区内迭代行,而不与任何其他分区内容交互Scala 如何基于列隔离分区?,scala,apache-spark,partition,Scala,Apache Spark,Partition,我希望在Spark数据帧的单个分区内执行独立的工作。我希望在单个分区内迭代行,而不与任何其他分区内容交互 repartition(“column”)将对列值进行散列,然后将它们模块化为默认数量的分区(spark.default.parallelism为200)。这可能会将每列分区的内容混合到Spark中的一个分区中 例如:我想在单个分组中单独迭代记录的10行(我故意重新分区(n,col),这样n小于或等于组数,但这说明了这一点): 虽然我根据我的分组列将重新划分为三个分区,但其中两个组最终都在一
repartition(“column”)
将对列值进行散列,然后将它们模块化为默认数量的分区(spark.default.parallelism
为200)。这可能会将每列分区的内容混合到Spark中的一个分区中
例如:我想在单个分组
中单独迭代记录的10行(我故意重新分区(n,col)
,这样n
小于或等于组数,但这说明了这一点):
虽然我根据我的分组
列将重新划分为三个分区,但其中两个组最终都在一个分区中。因此,当ImapPartitions
对多个分组
s数据执行任何迭代时
如何基于列名有效地隔离数据帧的子集,并隔离处理/迭代行?我是否需要对我的分区列进行反向工程和黑客攻击,这样就不会有两个哈希落入同一个模分区号中?或者我必须解释一个分区中的多个组吗
如果我认为我要将数据拆分为n个分区,那么这似乎也是一个性能影响因素,但如果一个分区中有多个子集,那么我可能会出现分区命名冲突,那么我对分区拆分的规划和大小调整是徒劳的。为什么需要按列隔离分区?只是为了按键进行迭代?或者按键存储?按键迭代,其中我需要跟踪特定于分区的某些状态,并且只跟踪该分区为什么需要按列隔离分区?只是为了按键进行迭代?或者按键存储?按键迭代,其中我需要跟踪特定于分区的某些状态,并且只跟踪该分区
val jsonString = """[{"eventId": 1, "grouping": 1, "debug": "foo"},
{"eventId": 2, "grouping": 1, "debug": "foo"},
{"eventId": 3, "grouping": 1, "debug": "foo"},
{"eventId": 4, "grouping": 2, "debug": "foo"},
{"eventId": 5, "grouping": 2, "debug": "foo"},
{"eventId": 6, "grouping": 2, "debug": "foo"},
{"eventId": 7, "grouping": 2, "debug": "foo"},
{"eventId": 8, "grouping": 3, "debug": "foo"},
{"eventId": 9, "grouping": 3, "debug": "foo"},
{"eventId": 10, "grouping": 3, "debug": "foo"}]"""
val df = spark.read.json(Seq(jsonString).toDS)
spark.createDataFrame(df.repartition(col("grouping")).rdd.mapPartitionsWithIndex((i,itr) => {itr.map(row => {Row.fromSeq(row.toSeq.updated(0, "test"))}) }), df.schema).show
val result = spark.createDataFrame(df.repartition(df.select("grouping").distinct.count.toInt, col("grouping"))
.rdd
.mapPartitionsWithIndex((i,itr) => {
val visitor = new AtomicLong()
itr.map(row => {
val debugIndex = row.fieldIndex("debug")
val groupingIndex = row.fieldIndex("grouping")
Row.fromSeq(row.toSeq.updated(debugIndex, s"Grouping: ${row.get(groupingIndex)}, Partition Index: ${i}}. Visitor: ${visitor.getAndIncrement()}"))
})
}), df.schema)
result
.sort("grouping")
.show(false)
+--------------------------------------------+-------+--------+
|debug |eventId|grouping|
+--------------------------------------------+-------+--------+
|Grouping: 1, Partition Index: 2}. Visitor: 1|2 |1 |
|Grouping: 1, Partition Index: 2}. Visitor: 0|1 |1 |
|Grouping: 1, Partition Index: 2}. Visitor: 2|3 |1 |
|Grouping: 2, Partition Index: 2}. Visitor: 3|4 |2 |
|Grouping: 2, Partition Index: 2}. Visitor: 4|5 |2 |
|Grouping: 2, Partition Index: 2}. Visitor: 5|6 |2 |
|Grouping: 2, Partition Index: 2}. Visitor: 6|7 |2 |
|Grouping: 3, Partition Index: 0}. Visitor: 0|8 |3 |
|Grouping: 3, Partition Index: 0}. Visitor: 1|9 |3 |
|Grouping: 3, Partition Index: 0}. Visitor: 2|10 |3 |
+--------------------------------------------+-------+--------+