将文件加载到地图中保持原始行顺序
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 时,顺序将被保留。
我需要加载一个查找 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 时,顺序将被保留。