亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何將CSV文件轉換為RDD

如何將CSV文件轉換為RDD

浮云間 2019-10-28 15:01:25
我是新來的火花。我想對CSV記錄中的特定數據執行一些操作。我正在嘗試讀取CSV文件并將其轉換為RDD。我的進一步操作基于CSV文件中提供的標題。(摘自評論)到目前為止,這是我的代碼:final JavaRDD<String> File = sc.textFile(Filename).cache();final JavaRDD<String> lines = File.flatMap(new FlatMapFunction<String, String>() {     @Override public Iterable<String> call(String s) {     return Arrays.asList(EOL.split(s));     } });final String heading=lines.first().toString();我可以獲得這樣的標題值。我想將此映射到CSV文件中的每個記錄。final String[] header=heading.split(" "); 我可以獲得這樣的標題值。我想將此映射到CSV文件中的每個記錄。在Java中,我CSVReader record.getColumnValue(Column header)用來獲取特定值。我需要做類似這里的事情。
查看完整描述

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 :-)


查看完整回答
反對 回復 2019-10-28
  • 3 回答
  • 0 關注
  • 1322 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號