3 回答

TA貢獻1779條經驗 獲得超6個贊
一種簡單的方法是擁有一種保留標頭的方法。
假設您有一個file.csv,例如:
user, topic, hits
om, scala, 120
daniel, spark, 80
3754978, spark, 1
我們可以定義一個標頭類,該標頭類使用第一行的解析版本:
class SimpleCSVHeader(header:Array[String]) extends Serializable {
val index = header.zipWithIndex.toMap
def apply(array:Array[String], key:String):String = array(index(key))
}
我們可以使用該標頭來處理以后的數據:
val csv = sc.textFile("file.csv") // original file
val data = csv.map(line => line.split(",").map(elem => elem.trim)) //lines in rows
val header = new SimpleCSVHeader(data.take(1)(0)) // we build our header with the first line
val rows = data.filter(line => header(line,"user") != "user") // filter the header out
val users = rows.map(row => header(row,"user")
val usersByHits = rows.map(row => header(row,"user") -> header(row,"hits").toInt)
...
請注意,header僅僅不過是助記符到數組索引的簡單映射。幾乎所有這些操作都可以在數組中元素的順序位置上完成,例如user = row(0)
PS:歡迎來到Scala :-)
添加回答
舉報