SparkSQL读写外部数据源--csv文件的读写
object CSVFileTest {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession
      .builder()
      .appName("CSVFileTest")
      .master("local")
      .getOrCreate()
    import spark.implicits._
    val df = spark.read.json(s"${BASE_PATH}/people.json")
    //将json文件数据转化成csv文件数据
    df.write.mode(SaveMode.Overwrite).csv(s"${BASE_PATH}/csv")
    val csvDF = spark.read.csv(s"${BASE_PATH}/csv").toDF("age", "name")
    csvDF.show()
    //从String类型中的Dataset来创建DataFrame
    val csvDS = spark.createDataset(Seq("23,jeffy", "34,katy"))
    val ds = spark.read.csv(csvDS)
    ds.show()
    //1: sep 和 delimiter的功能都是一样,都是表示csv的切割符,(默认是,)(读写参数)
    spark.read.csv(Seq("23,jeffy", "34,katy").toDS()).show()
    spark.read.option("sep", " ").csv(Seq("23 jeffy", "34 katy").toDS()).show()
    spark.read.option("delimiter", " ").csv(Seq("23 jeffy", "34 katy").toDS()).show()
    ds.write.mode(SaveMode.Overwrite).option("sep", "|").csv(s"${BASE_PATH}/delimiter")
    //2: header(默认是false) 表示是否将csv文件中的第一行作为schema(读写参数)
    spark.read.csv(s"${BASE_PATH}/cars.csv").show()
    /*
    +----+-----+-----+--------------------+-----+
    | _c0|  _c1|  _c2|                 _c3|  _c4|
    +----+-----+-----+--------------------+-----+
    |year| make|model|             comment|blank|
    |2012|Tesla|    S|          No comment| null|
    |1997| Ford| E350|Go get one now th...| null|
    |2015|Chevy| Volt|                null| null|
    +----+-----+-----+--------------------+-----+
     */
    val headerDF = spark.read.option("header", true).csv(s"${BASE_PATH}/cars.csv")
    headerDF.printSchema()
    headerDF.write.mode(SaveMode.Overwrite).option("header", true).csv(s"${BASE_PATH}/headerDF")
    /*
    root
     |-- year: string (nullable = true)
     |-- make: string (nullable = true)
     |-- model: string (nullable = true)
     |-- comment: string (nullable = true)
     |-- blank: string (nullable = true)
     */
    headerDF.show()
    /*
    +----+-----+-----+--------------------+-----+
    |year| make|model|             comment|blank|
    +----+-----+-----+--------------------+-----+
    |2012|Tesla|    S|          No comment| null|
    |1997| Ford| E350|Go get one now th...| null|
    |2015|Chevy| Volt|                null| null|
    +----+-----+-----+--------------------+-----+
     */
    //3: inferSchema 表示是否支持从数据中推导出schema(只读参数)
    val inferSchemaDF =
      spark.read.option("header", true).option("inferSchema", true).csv(s"${BASE_PATH}/cars.csv")
    inferSchemaDF.printSchema()
    /*
    root
     |-- year: integer (nullable = true)
     |-- make: string (nullable = true)
     |-- model: string (nullable = true)
     |-- comment: string (nullable = true)
     |-- blank: string (nullable = true)
     */
    inferSchemaDF.show()
    /*
    +----+-----+-----+--------------------+-----+
    |year| make|model|             comment|blank|
    +----+-----+-----+--------------------+-----+
    |2012|Tesla|    S|          No comment| null|
    |1997| Ford| E350|Go get one now th...| null|
    |2015|Chevy| Volt|                null| null|
    +----+-----+-----+--------------------+-----+
     */
    //4: charset和encoding(默认是UTF-8),根据指定的编码器对csv文件进行解码(只读参数)
    spark.read.option("header", "true").option("encoding", "iso-8859-1").option("sep", "þ").csv(s"${BASE_PATH}/cars_iso-8859-1.csv").show()
    /*
    +----+-----+-----+--------------------+-----+
    |year| make|model|             comment|blank|
    +----+-----+-----+--------------------+-----+
    |2012|Tesla|    S|          No comment| null|
    |1997| Ford| E350|Go get one now th...| null|
    |2015|Chevy| Volt|                null| null|
    +----+-----+-----+--------------------+-----+
     */
    //5: quote(默认值是`"` ) 表示将不需要切割的字段值用quote标记起来(读写参数)
    var optMap = Map("quote" -> "\'", "delimiter" -> " ")
    spark.read.options(optMap).csv(Seq("23 'jeffy tang'", "34 katy").toDS()).show()
    /*
    +---+----------+
    |_c0|       _c1|
    +---+----------+
    | 23|jeffy tang|
    | 34|      katy|
    +---+----------+
     */
    //6: escape(默认值是`\`) 如果在quote标记的字段值中还含有quote,则用escape来避免(读写参数)
    optMap = Map("quote" -> "\'", "delimiter" -> " ", "escape" -> "\"")
    spark.read.options(optMap).csv(Seq("23 'jeffy \"'tang'", "34 katy").toDS()).show()
    //7: comment(默认是空字符串,表示关闭这个功能) 表示csv中的注释的标记符(读写参数)
    optMap = Map("comment" -> "~", "header" -> "false")
    spark.read.options(optMap).csv(s"${BASE_PATH}/comments.csv").show()
    /*
    +---+---+---+---+----+-------------------+
    |_c0|_c1|_c2|_c3| _c4|                _c5|
    +---+---+---+---+----+-------------------+
    |  1|  2|  3|  4|5.01|2015-08-20 15:57:00|
    |  6|  7|  8|  9|   0|2015-08-21 16:58:01|
    |  1|  2|  3|  4|   5|2015-08-23 18:00:42|
    +---+---+---+---+----+-------------------+
     */
    //8: (读写参数)
    //ignoreLeadingWhiteSpace(默认是false) 表示是否忽略字段值前面的空格
    //ignoreTrailingWhiteSpace(默认是false) 表示是否忽略字段值后面的空格
    optMap = Map("ignoreLeadingWhiteSpace" -> "true", "ignoreTrailingWhiteSpace" -> "true")
    spark.read.options(optMap).csv(Seq(" a,b  , c ").toDS()).show()
    //9: multiLine(默认是false) 是否支持一条记录被拆分成了多行的csv的读取解析(只读参数)
    val primitiveFieldAndType = Seq(
      """"
        |string","integer
        |
        |
        |","long
        |
        |","bigInteger",double,boolean,null""".stripMargin,
      """"this is a
        |simple
        |string.","
        |
        |10","
        |21474836470","92233720368547758070","
        |
        |1.7976931348623157E308",true,""".stripMargin)
      primitiveFieldAndType.toDF("value").coalesce(1).write.mode(SaveMode.Overwrite).text(s"csv_multiLine_test")
      spark.read.option("header", true).option("multiLine", true).csv("csv_multiLine_test").show()
    //10: mode(默认是PERMISSIVE) (只读参数)
    //PERMISSIVE 表示碰到解析错误的时候,将字段都置为null
    //DROPMALFORMED 表示忽略掉解析错误的记录
    //FAILFAST 当有解析错误的时候,立马抛出异常
    val schema = new StructType().add("a", IntegerType).add("b", TimestampType)
    val df1 = spark.read.option("mode", "PERMISSIVE").schema(schema).csv(Seq("0,2013-111-11 12:13:14", "1,1983-08-04").toDS())
    df1.show()
    //11: nullValue(默认是空字符串), 表示需要将nullValue指定的字符串解析成null(读写参数)
    spark.read.option("nullValue", "--").csv(Seq("0,2013-11-11,--", "1,1983-08-04,3").toDS()).show()
    //12: nanValue(默认值为NaN) (只读参数)
    //positiveInf
    //negativeInf
    val numbers = spark.read.format("csv").schema(StructType(List(
        StructField("int", IntegerType, true),
        StructField("long", LongType, true),
        StructField("float", FloatType, true),
        StructField("double", DoubleType, true)
      ))).options(Map(
        "header" -> "true",
        "mode" -> "DROPMALFORMED",
        "nullValue" -> "--",
        "nanValue" -> "NAN",
        "negativeInf" -> "-INF",
        "positiveInf" -> "INF")).load(s"${BASE_PATH}/numbers.csv")
    numbers.show()
    /*
    +----+--------+---------+---------------+
    | int|    long|    float|         double|
    +----+--------+---------+---------------+
    |   8| 1000000|    1.042|2.38485450374E7|
    |null|34232323|   98.343|184721.23987223|
    |  34|    null|   98.343|184721.23987223|
    |  34|43323123|     null|184721.23987223|
    |  34|43323123|223823.95|           null|
    |  34|43323123| 223823.0|            NaN|
    |  34|43323123| 223823.0|       Infinity|
    |  34|43323123| 223823.0|      -Infinity|
    +----+--------+---------+---------------+
     */
    //13: codec和compression 压缩格式,支持的压缩格式有:
    //none 和 uncompressed表示不压缩
    //bzip2、deflate、gzip、lz4、snappy (只写参数)
    inferSchemaDF.write.mode(SaveMode.Overwrite).option("compression", "gzip").csv(s"${BASE_PATH}/compression")
    //14 dateFormat (读写参数)
    val customSchema = new StructType(Array(StructField("date", DateType, true)))
    val date1 =
      spark.read.option("dateFormat", "dd/MM/yyyy HH:mm").schema(customSchema).csv(Seq("26/08/2015 18:00", "27/10/2014 18:30").toDS())
    date1.printSchema()
    /*
    root
      |-- date: date (nullable = true)
     */
    date1.write.mode(SaveMode.Overwrite).option("dateFormat", "yyyy-MM-dd").csv(s"${BASE_PATH}/dateFormat")
    spark.read.csv(s"${BASE_PATH}/dateFormat").show()
    //15: timestampFormat (读写参数)
    val timeSchema = new StructType(Array(StructField("date", TimestampType, true)))
    val time =
      spark.read.option("timestampFormat", "dd/MM/yyyy HH:mm").schema(timeSchema).csv(Seq("26/08/2015 18:00", "27/10/2014 18:30").toDS())
    time.printSchema()
    /*
    root
      |-- date: timestamp (nullable = true)
     */
    time.write.mode(SaveMode.Overwrite).option("timestampFormat", "yyyy-MM-dd HH:mm").csv(s"${BASE_PATH}/timestampFormat")
    spark.read.csv(s"${BASE_PATH}/timestampFormat").show()
    //16: maxColumns(默认是20480) 规定一个csv的一条记录最大的列数 (只读参数)
    spark.read.option("maxColumns", "3").csv(Seq("test,as,g", "h,bm,s").toDS()).show() //会报错
    spark.stop()
  }
}
SparkSQL读写外部数据源--csv文件的读写的更多相关文章
- SparkSQL读写外部数据源-json文件的读写
		
object JsonFileTest { def main(args: Array[String]): Unit = { val spark = SparkSession .builder() .m ...
 - SparkSQL读写外部数据源-jext文件和table数据源的读写
		
object ParquetFileTest { def main(args: Array[String]): Unit = { val spark = SparkSession .builder() ...
 - python CSV 文件的读写
		
1.CSV文件 import csv with open(r"E:\code\0_DataSet\tianchi_2015_mobile_recommand\fresh_comp_offli ...
 - SparkSQL读写外部数据源-通过jdbc读写mysql数据库
		
object JdbcDatasourceTest { def main(args: Array[String]): Unit = { val spark = SparkSession .builde ...
 - csv文件的读写
		
# -*- coding: utf-8 -*- """ Spyder Editor This is a temporary script file. "&quo ...
 - java应用:csv文件的读写
		
csv数据特点: csv是文本格式,一行数据是一条记录,每个单元之间用“,”隔开.csv数据可以用Excel打开. 读写csv文件的主要程序如下所示: import java.io.BufferedR ...
 - Python实现对CSV文件的读写功能
		
我们要处理csv文件,首先要的导入csv模块 import csv #读取csv文件def readCsv(path): #传入变量csv文件的路径 list=[] #定义一个空列表 with ope ...
 - python 下 excel,csv 文件的读写
		
python 可以用利用xlrd 库读取数据excel数据,可以用xlwt写入excel数据,用csv 操作csv文件 xlrd xlwt python 模块 官方链接 https://pypi. ...
 - Python 标准库 csv —— csv 文件的读写
		
csv 文件,逗号分割文件. 0. 读取 csv 到 list from csv import reader def load_csv(csvfile): dataset = [] with open ...
 
随机推荐
- [转帖]浅谈分布式一致性与CAP/BASE/ACID理论
			
浅谈分布式一致性与CAP/BASE/ACID理论 https://www.cnblogs.com/zhang-qc/p/6783657.html ##转载请注明 CAP理论(98年秋提出,99年正式发 ...
 - IDEA+docker实践
			
1.下载 https://www.jetbrains.com/ 2.下载jdk 目前在官网下载jdk的时候需要登陆,这边分享一个账号,方便下载 2696671285@qq.com 密码:Oracle1 ...
 - JVM中内存的设置和分配(最大内存,总内存,剩余内存的区别)
			
1.设置分配的内存大小 -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M -vmargs 说明后面是VM的参数,所以后面的 ...
 - 0-python变量及基本数据类型
			
目录 1.变量2.字符串3.布尔类型4.整数5.浮点数6.日期 1.变量 1.1.变量的定义 - 类似于标签 1.2.变量的命名规则 - (强制)变量名只能包含数字.字母.下划线 - (强制)不能以数 ...
 - POJ 1321 棋盘问题(C)回溯
			
Emmm,我又来 POJ 了,这题感觉比上次做的简单点.类似皇后问题.但是稍微做了一点变形,比如棋子数量是不定的.棋盘形状不在是方形等等. 题目链接:POJ 1321 棋盘问题 解题思路 基本思路:从 ...
 - vue路由懒加载及组件懒加载
			
一.为什么要使用路由懒加载 为给客户更好的客户体验,首屏组件加载速度更快一些,解决白屏问题. 二.定义 懒加载简单来说就是延迟加载或按需加载,即在需要的时候的时候进行加载. 三.使用 常用的懒加载方式 ...
 - python3 简陋的学生信息管理系统
			
# 编写一个“学生信息管理系统”# 输入序号:1. 输入学生信息,学生信息包括:id,name,age,gender(用什么数据类型保存?)# 2. 查询:输入学生姓名和id,显示学生个人信息# 3. ...
 - k8s 回滚应用
			
kubectl apply 每次更新应用时 Kubernetes 都会记录下当前的配置,保存为一个 revision(版次),这样就可以回滚到某个特定 revision. 滚动更新是一次只更新一小部分 ...
 - 华为云·寻找黑马程序员#【代码重构之路】如何“消除”if/else【华为云技术分享】
			
1. 背景 if/else是高级编程语言中最基础的功能,虽然 if/else 是必须的,但滥用 if/else,特别是各种大量的if/else嵌套,会对代码的可读性.可维护性造成很大伤害,对于阅读代码 ...
 - 题解 POJ 2559-SP1805 【HISTOGRA - Largest Rectangle in a Histogram】
			
题目链接: https://www.luogu.org/problemnew/show/SP1805 http://poj.org/problem?id=2559 思路: ## 单调栈 首先如果所有矩 ...