学习 Spark 2(五):Spark 读写 CSV

Spark 2.0 之前,Spark SQL 读写 CSV 格式文件,需要 Databricks 官方提供的 spark-csv 库。在 Spark 2.0 之后,Spark SQL 原生支持读写 CSV 格式文件。

读 CSV 文件:

CSV 文件:

tom^male^18  
jerry^femal^16  

代码 🌰:

spark.read  
  .format("csv")
  .options(Map(
    "delimiter" -> "^",
    "nullValue" -> "\\N",
    "quote" -> "",
    "inferSchema" -> "true"))
  .load("/data/friends/*")
  .toDF("name", "sex", "age") // 字段重命名

参数说明:

  • delimiter 分隔符,默认为,
  • nullValue 指定一个字符串代表 null 值
  • quote 引号字符,默认为''
  • inferSchema 自动推测字段类型

自动推测字段类型只是折中方案,更好的方案是指定字段类型:

定义 case class:

case class Friend (name: String, sex: String, age: Int)  

指定 Schema:

spark.read  
  .format("csv")
  .options(Map(
    "delimiter" -> "^",
    "nullValue" -> "\\N",
    "quote" -> ""))
  .schema(ScalaReflection.schemaFor[Friend].dataType.asInstanceOf[StructType])
  .load("/data/friends/*")
  .as[Friend]

写 CSV 文件

r.write  
  .mode(SaveMode.Overwrite)
  .option("delimiter", "^")
  .option("quote", "")
  .option("nullValue", "\\N")
  .csv("/data/friends/")

保存 CSV 格式文件,默认裁剪字符串前后空格

在 Spark 2.1.1 使用 Spark SQL 保存 CSV 格式文件,默认情况下,会自动裁剪字符串前后空格。

这样的默认行为有时候并不是我们所期望的,在 Spark 2.2.0 之后,可以通过配置关闭改功能:

r.write  
  .mode(SaveMode.Overwrite)
  .option("delimiter", "^")
  .option("quote", "")
  .option("nullValue", "\\N")
  .option("ignoreLeadingWhiteSpace", false)
  .option("ignoreTrailingWhiteSpace", false)
  .csv("/data/friends/")

参数说明:

  • ignoreLeadingWhiteSpace 裁剪前面的空格
  • ignoreTrailingWhiteSpace 裁剪后面的空格

参考:https://stackoverflow.com/questions/47021073/spark-sql-removing-white-spaces