基于列分区Spark DataFrame

时间:2016-05-23 00:16:04

标签: apache-spark

我试图根据列" b"来划分Spark DataFrame。使用groupByKey()但我最终在同一个分区中有不同的组。

以下是数据框和我使用的代码:

  def self.search(search)
    where('title LIKE ?', "%#{search}%")
  end

第4组和第1组在同一个分区(2)中,我想将它们放在不同的分区中,你知道怎么做吗?

df:
+---+---+
|  a|  b|
+---+---+
|  4|  2|
|  5|  1|
|  1|  4|
|  2|  2|
+---+---+


 val partitions = df.map(x => x.getLong(1)).distinct().count().toInt
 val df2 = df.map(r => (r.getLong(1), r)).groupByKey(partitions)
 val gb = df2.mapPartitions(iterator => {
            val rows = iterator.toList
            println(rows)
            iterator
            })

The printed rows are:
Partition 1: List((2,CompactBuffer([4,2], [2,2])))
Partition 2: List((4,CompactBuffer([1,4])), (1,CompactBuffer([5,1])))

P.S。为了给你一些上下文,我这样做是因为我需要使用来自共享特定列的相同值的所有其他行的数据来更新DataFrame中的行。因此map()是不够的,我目前正在尝试使用mapPartitions(),其中每个分区将包含具有特定列的相同值的所有行。如果您知道更好的方法,请不要犹豫告诉我:)

非常感谢!

ClydeX

1 个答案:

答案 0 :(得分:1)

这听起来像你要做的,可以通过使用窗口函数来完成:https://databricks.com/blog/2015/07/15/introducing-window-functions-in-spark-sql.html