Конвертировать Spark Dataframe в Scala Карта ключей, список значений - PullRequest
0 голосов
/ 06 июля 2019

У меня есть фрейм данных в форме:

Abc      | apple
Abc      | mango
xyz      | grapes
xyz      | peach

Я хочу преобразовать этот фрейм данных в карту скала (ключ, список значений), например: (Abc -> (apple, mango),(xyz -> (grapes, персик)).

Мой код:

concatenatedLogs.collect.map( r => {
  val key = r(0).toString
  val value = r(1).toString
  var currList = testMap.getOrElse(key,List[String]())
  currList = value ::currList
  testMap+=(key -> currList)
 }
)

Это дает мне кучу пространства Java из-за ошибки памяти. Есть ли более эффективный и простой способ сделатьэто?

1 Ответ

2 голосов
/ 06 июля 2019

Spark - это инфраструктура распределенной обработки, когда вы имеете дело с большим количеством данных. Spark обрабатывает их в кластере, когда вы вызываете функцию сбора, все данные, которые считываются на всех разных ядрах / машинах, возвращаются в драйвер. Когда вы делаете это, вы должны убедиться, что у вас достаточно памяти на вашем драйвере.

То, что вы делаете, крайне неэффективно, потому что вы собираете весь фрейм данных в драйвер, а затем выполняете преобразования на нем. Используя spark, вы можете сделать что-то похожее с кодом ниже:


  val someDF = Seq(
    ("Abc", "apple"),
    ("Abc", "mango"),
    ("xyz", "grapes"),
    ("xyz", "peach")
  ).toDF(
    "group", "fruit")


  val s = someDF.groupBy(col("group")).
    agg(collect_list("fruit").as("fruits")).as[(String, List[String])].collect.toMap

выход этого

Map(Abc -> List(apple, mango), xyz -> List(grapes, peach))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...