看很多資料,很少有講怎么去操作讀寫csv文件的,我也查了一些。很多博客都是很老的方法,還有好多轉來轉去的,復制粘貼都不能看。下面我在這里歸納一下,以免以后用到時再費時間去查.前端實現文件下載和拖拽上傳
通過sc.textFile
val input = sc.textFile("test.csv")
val result = input.map { line =>
val reader = new CSVReader(new StringReader(line));
reader.readNext()
}
// 創建了RDD
確實這樣操作可以讀取,但是根據csv文件的格式能夠發現不方便后續操作,官方也建議通過Spark SQL來操作讀寫csv
怎么寫?順便提一句吧rdd.toDF.write.csv(...)
,要引入隱式操作import spark.implicits._
通過SparkSQL讀取csv文件
在 spark 1.x 中,讀寫csv使用了第三方庫 spark-csv
,由 databricks 提供。 但在 spark 2.0中,將 csv 作為一個內置的源代碼。 這個決定主要是由於 csv 是企業中使用的主要數據格式之一。因此遷移到 spark 2.0時,需要將代碼移動到使用構建在 csv 源代碼中的代碼,而不是使用第三方代碼
1.x版本Spark SQL內置支持三種格式數據源:parquet(默認)、json、jdbc,所以讀取csv文件需要依賴com.databricks.spark.csv
// spark是SparkSession對象
val df = spark.read
.format("com.databricks.spark.csv")
.option("header", "true") //reading the headers
.option("mode", "DROPMALFORMED")
.load("csv/file/path"); //.csv("csv/file/path") //spark 2.0 api
df.show()
2.x后也內置了csv的解析器,也可以簡單滴使用csv(),
val df=spark.read.format("csv").option("header", "true").option("mode", "DROPMALFORMED").csv("csv/file/path")
val spark = SparkSession.builder().appName("fileRead").getOrCreate()
import spark.implicits._
val data1 = spark.read
// 推斷數據類型
.option("inferSchema", "true")
// 可設置分隔符,默認,
//.option("delimiter",",")
// 設置空值
.option("nullValue", "?")
// 表示有表頭,若沒有則為false
.option("header", true)
// 文件路徑
.csv("test.csv")
// 打印數據格式
data1.printSchema()
// 顯示數據,false參數為不要把數據截斷
data1.show(false)
通過SparkSQL寫csv
//1.x
data.write.format("com.databricks.spark.csv")
.option("header", "false")//在csv第一行有屬性”true”,沒有就是”false”
.option("delimiter",",")//默認以”,”分割
.save(outpath/test.csv)
//2.x
data.write
.option("header", "true")
.csv("outpath/test.csv")
貌似確定是否有頭部那塊寫true或者字符串"true"都可以
可以參考 stackmirror 上這兩個討論:
發現有些網站真的是惡心,轉我文章還不標准出處