2016-05-23 2 views
3

Я пытаюсь разбить Spark DataFrame на основе столбца «b» с помощью groupByKey(), но в итоге у меня есть разные группы в одном разделе.Partition Spark DataFrame на основе столбца

Вот кадр данных и код, я использую:

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]))) 

Группы 4 и 1 находятся в том же разделе (2), и я хотел бы иметь их в отдельных разделах, вы знаете, как это сделать?

Desired output: 
Partition 1: List((2,CompactBuffer([4,2], [2,2]))) 
Partition 2: List((4,CompactBuffer([1,4]))) 
Partition 3: List((1,CompactBuffer([5,1]))) 

P.S. Чтобы дать вам немного контекста, я делаю это, потому что мне нужно обновлять строки в DataFrame, используя данные из всех остальных строк, имеющих одинаковое значение для определенного столбца. Поэтому map() недостаточно, я в настоящее время пытаюсь использовать mapPartitions(), где каждый раздел будет содержать все строки, имеющие одинаковое значение для конкретного столбца. Не стесняйтесь сказать мне, знаете ли вы, как лучше это сделать :)

Спасибо большое!

ClydeX

ответ

Смежные вопросы