zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    C#发送邮件的实现实例解析
    抄录一下别人的经验
    centos学习一
    关于百度地图API批量转换成坐标的方法
    js和PHP等脚本语言for循环和if语句里面定义变量的作用域
    关于js中去取数组中的重复字符串
    关于handler返回的数据处理
    通过定义任务委托的方法处理 action
    关于点击按钮图片左右切换的随笔
    关于网站内容分享到新浪微博等的代码
  • 原文地址:https://www.cnblogs.com/qixidi/p/10229242.html
Copyright © 2011-2022 走看看