1. 程式人生 > >Spark1.x和2.x如何讀取和寫入csv檔案

Spark1.x和2.x如何讀取和寫入csv檔案

看很多資料,很少有講怎麼去操作讀寫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 上這兩個討論:


發現有些網站真的是噁心,轉我文章還不標準出處

來源:https://blog.csdn.net/lzw2016/article/details/85562172