将文件加载到地图中保持原始行顺序

Load file into Map keep original line order

我需要加载一个查找 CSV 文件,该文件将用于将一些正则表达式规则(键、值)应用于字符串。这些规则需要按照它们在文件中出现的顺序应用。

将其加载到地图中并不能保证保持顺序。

有没有办法在保持文件行顺序的同时将 CSV 文件加载到类似 TreeMap(或其他)的结构中?

我想避免将 index/key 直接硬编码到文件中(这是一个可能的解决方案,但会使维护 CSV 词典变得更加困难)。也许有一种方法可以在加载时生成索引 "on the fly"?

val vMap = sparkSession.read.option( "header", true ).csv( pPath )
      .rdd.map(x => (x.getString(0), x.getString(1)))  
      .collectAsMap()

所以有一些 "rules" 像 :

(ab)cd, 

(ab)cde, 

(ab),

(ab)cdfgh,

(ff)gt,

我希望最终能够拥有一个我可以迭代的集合,遵循相同的顺序,最好使用 foreach 方法。我现在得到的是一个随机地图,每次都会以不同的顺序迭代。

编辑:忘记提及我正在使用 scala 版本 2.11.12, 已打包到最新的 spark 版本中。

可能的解决方案(基于 user6337 的回答)

所以阅读答案并思考它,得到了这段代码。

var myMap = new mutable.LinkedHashMap[String, String]()
val vList = sparkSession.read.option( "header", true ).csv( pPath )
      .collect().map( t => myMap += ((t(0).toString, t(1).toString)))

myMap.foreach( x => println(x._1+ " - "+x._2) 

我的新问题是这种读取 Dataframe 是否足以保证文件行顺序。

使用 LinkedHashMap,它保留将项目添加到 LinkedHashMap 的顺序。

这是一些示例代码

import scala.collection.mutable

object Main extends App {

  val myList = List(("1", "a"),("2","b"),("3","c"),("4","d"))
  println(myList)

  val myMap = mutable.LinkedHashMap[String, String]()

  myMap.addAll(myList)

  myMap.foreach(println)
}

运行 此代码打印

List((1,a), (2,b), (3,c), (4,d))
(1,a)
(2,b)
(3,c)
(4,d)

这就是你想要的。

因此,首先将您的数据转换为一个集合,如 List 或 Vector,然后使用 addAll 将其加载到您的可变 LinkedHashMap 中。当您在 LinkedHashMap 上使用 map 或 foreach 时,顺序将被保留。