繁体   English   中英

如何将 Scala Spark 数据帧转换为 LinkedHashMap[String, String]

[英]How to convert a Scala Spark Dataframe to LinkedHashMap[String, String]

以下是我的数据框:

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 |
+----------+---------+

我正在尝试从上面的数据帧在 Scala 中创建一个Map集合对象(如下所示)。

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

问题:
1)数据帧记录的顺序是否与位于表格下方的原始文件中的内容顺序匹配?
2)如果我对数据帧执行collect() ,创建的数组的顺序是否与原始文件中的内容顺序匹配?
说明:当我执行df.collect().map(t => t(0) -> t(1)).toMap ,看起来地图集合对象不保留插入顺序,这也是默认的Scala 映射的行为。
res01: scala.collection.immutable.Map[Any,Any] = Map(kohls -> 103, jcpenny -> 102 ...)
3)那么,如何将数据帧转换为实际上保留插入顺序/记录序列的scala集合映射对象之一。
说明: 由于LinkedHashMap是保证插入顺序的 Scala 映射集合对象类型之一。 我正在尝试找到一种将数据帧转换为LinkedHashMap对象的方法。

您可以从 Scaladoc 页面使用 LinkedHashMap:

“这个类使用哈希表实现可变映射。这个类的迭代器和所有遍历方法按照元素插入的顺序访问元素。”

但是 Dataframes 并不能保证顺序总是相同的。

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, ..)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM