我有一个包含两列的csv文件,如下所示:
column1 column2
sachin@@@tendulkar@@@Ganguly cricket@@@India@@@players
我想将其转换为哈希映射,如下所示:
sachin-> "cricket, India, players"
tendulkar-> "cricket, India, players"
Ganguly-> "cricket, India, players"
板球,印度,球员这应该是一个字符串。我怎样才能在scala中完成它? 这就是我到目前为止所做的事情
val csv = sc.textFile("/tag/players.csv")
val headerAndRows = csv.map(line => line.split(",").map(_.trim))
val header = headerAndRows.first()
val synonyms = csv.map(_.split(",")).map( p=>(p(1)) // for column1
val targettag = csv.map(_.split(",")).map(p=>p(2)) // for column2
val splitsyno = synonyms.map(x => x.split("@@@"))
val splittarget = targettag.map(x=>x.split("@@@"))
我想知道如何继续创建所需的hashmap?
答案 0 :(得分:1)
该代码适用于单行。之后,您可以根据需要合并所有行。我已经对提供的行进行了硬编码。
首先,它将数据拆分为元组。 Step2正在取代' @@@' of column2 with','。 第3步是拆分第1列' at' @@@'并将其映射到元组作为Map的元素,然后将其转换为地图。
您可以完全优化解决方案。
val data = "sachin@@@tendulkar@@@Ganguly, cricket@@@India@@@players"
val (c1:String, c2:String) = data.split(",") match {
case Array(a, b) => (a,b)
}
val c2s = c2.replace("@@@", ",")
val xx = c1.split("@@@").map(_ -> c2s).toMap
// Just to validate the ouput
xx.foreach(f => println(f._1 + "->" + f._2))
答案 1 :(得分:1)
我会执行以下操作(请注意,我跳过映射一行csv以提取s[b] = 1
和column1
):
column2
答案 2 :(得分:0)
此代码有效,但非常“功能”
import scala.collection.mutable.Map
object parseData {
val inputSource = io.Source.fromFile("<input-file>")
val dataMap = Map.empty[String, String]
for (line <- inputSource.getLines.drop(1)) {
val keysAndValues = line.split(" +")
val keys = keysAndValues(0).split("@@@")
val values = keysAndValues(1).split("@@@").mkString(", ")
for (k <- keys) {
dataMap += (k -> values)
}
}
inputSource.close
}
我们可能会把一堆事情说成一堆。但这是一个很好的开始。 drop(1)
不会在column1
中包含column2
和dataMap
。
输出:
Map(tendulkar -> cricket, India, players, Ganguly -> cricket, India, players, sachin -> cricket, India, players)