Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何基于列隔离分区?_Scala_Apache Spark_Partition - Fatal编程技术网

Scala 如何基于列隔离分区?

Scala 如何基于列隔离分区?,scala,apache-spark,partition,Scala,Apache Spark,Partition,我希望在Spark数据帧的单个分区内执行独立的工作。我希望在单个分区内迭代行,而不与任何其他分区内容交互 repartition(“column”)将对列值进行散列,然后将它们模块化为默认数量的分区(spark.default.parallelism为200)。这可能会将每列分区的内容混合到Spark中的一个分区中 例如:我想在单个分组中单独迭代记录的10行(我故意重新分区(n,col),这样n小于或等于组数,但这说明了这一点): 虽然我根据我的分组列将重新划分为三个分区,但其中两个组最终都在一

我希望在Spark数据帧的单个分区内执行独立的工作。我希望在单个分区内迭代行,而不与任何其他分区内容交互

repartition(“column”)
将对列值进行散列,然后将它们模块化为默认数量的分区(
spark.default.parallelism
为200)。这可能会将每列分区的内容混合到Spark中的一个分区中

例如:我想在单个
分组
中单独迭代记录的10行(我故意
重新分区(n,col)
,这样
n
小于或等于组数,但这说明了这一点):

虽然我根据我的
分组
列将
重新划分为三个分区,但其中两个组最终都在一个分区中。因此,当I
mapPartitions
对多个
分组
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       |
+--------------------------------------------+-------+--------+