Scala 将文件加载到地图中并保持原始行顺序
我需要加载一个查找CSV文件,该文件将用于对字符串应用一些正则表达式规则(键、值)。这些规则需要按照它们在文件中出现的顺序应用 将其加载到地图并不能保证秩序得到维持 在保持文件行顺序的同时,是否有办法将CSV文件加载到树映射(或其他)这样的结构中 我希望避免将索引/键直接硬编码到文件中(这是一种可能的解决方案,但会使维护CSV字典更加困难)。也许有一种方法可以在加载时“动态”生成索引Scala 将文件加载到地图中并保持原始行顺序,scala,apache-spark,collections,treemap,Scala,Apache Spark,Collections,Treemap,我需要加载一个查找CSV文件,该文件将用于对字符串应用一些正则表达式规则(键、值)。这些规则需要按照它们在文件中出现的顺序应用 将其加载到地图并不能保证秩序得到维持 在保持文件行顺序的同时,是否有办法将CSV文件加载到树映射(或其他)这样的结构中 我希望避免将索引/键直接硬编码到文件中(这是一种可能的解决方案,但会使维护CSV字典更加困难)。也许有一种方法可以在加载时“动态”生成索引 val vMap=sparkSession.read.option(“header”,true).csv(pPa
val vMap=sparkSession.read.option(“header”,true).csv(pPath)
.rdd.map(x=>(x.getString(0),x.getString(1)))
.collectAsMap()
所以有一些“规则”,比如:
我希望最终能够拥有一个可以按照相同顺序迭代的集合,最好使用foreach
方法。我现在得到的是一个随机映射,它将以不同的顺序每次迭代
编辑:忘了提到我正在使用scala 2.11.12版,,这是最新的spark发行版中附带的
可能的解决方案(基于用户6337的回答)
因此,阅读答案并用它思考,得到了这段代码
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)
我新担心的是,数据帧的这种读取是否足以保证文件行的顺序。使用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)
这就是你想要的
因此,首先将数据转换为列表或向量之类的集合,然后使用addAll将其加载到可变LinkedHashMap中。在LinkedHashMap上使用map或foreach时,将保留顺序。感谢您的深入了解。我得到了返回列表的函数。不幸的是,我查看了有关我的scala版本和它的文档dosen没有addAll方法。所以我重写了read函数,使从列表到LinkHashedList的映射看起来有效,将用这个可能的解决方案更新问题。还有一件事,对此进行了研究,我了解到数据帧也不能保证文件行顺序。我想知道在读取和传递时是否存在这样的风险将数据放到Hashmap中一些数据最终可能会被放错位置我想我会把你的答案标记为解决方案,因为它非常接近:)而且我还没有足够的代表投票。
List((1,a), (2,b), (3,c), (4,d))
(1,a)
(2,b)
(3,c)
(4,d)