Как преобразовать DataFrame Scala Spark в LinkedHashMap [String, String] - PullRequest
0 голосов
/ 01 ноября 2018

Ниже мой фрейм данных:

val myDF= spark.sql("select company, comp_id from my_db.my_table")
myDF: org.apache.spark.sql.DataFrame = [company: string, comp_id: string]

А данные выглядят как

+----------+---------+
|  company |comp_id  |
+----------+---------+
|macys     |     101 |
|jcpenny   |     102 |
|kohls     |     103 |
|star bucks|     104 |
|macy's    |     105 |
+----------+---------+

Я пытаюсь создать объект коллекции Map (как показано ниже) в Scala из приведенного выше фрейма данных.

Map("macys" -> "101", "jcpenny" -> "102" ..., "macy's" -> "105")

Вопросы:
1) Будет ли последовательность записей в кадре данных совпадать с последовательностью содержимого в исходном файле, расположенном под таблицей?
2) Если я сделаю collect() на кадре данных, будет ли последовательность создаваемого массива соответствовать последовательности содержимого в исходном файле?
Объяснение: Когда я делаю df.collect().map(t => t(0) -> t(1)).toMap, похоже, что объект коллекции карт не сохраняет порядок вставки, что также является поведением по умолчанию для карты скалы.
res01: scala.collection.immutable.Map[Any,Any] = Map(kohls -> 103, jcpenny -> 102 ...)
3) Итак, как преобразовать фрейм данных в один из объектов карты коллекции scala, который фактически сохраняет порядок вставки / последовательность записей.
Объяснение: Поскольку LinkedHashMap является одним из типов объектов коллекции карт Scala, чтобы обеспечить порядок вставки. Я пытаюсь найти способ преобразовать фрейм данных в LinkedHashMap объект.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018
import collection.mutable.LinkedHashMap
var myMap = LinkedHashMap[String, String]()

myDF.collect().map(t => myMap += (t(0).toString -> t(1).toString))

при печати myMap

res01: scala.collection.mutable.LinkedHashMap[String,String] = Map(macys -> 101, ..)
0 голосов
/ 01 ноября 2018

Вы можете использовать LinkedHashMap со страницы Scaladoc:

"Этот класс реализует изменяемые карты с использованием хеш-таблицы. Итератор и все методы обхода этого класса посещают элементы в том порядке, в котором они были вставлены."

Но датафреймы не гарантируют, что порядок всегда будет одинаковым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...