看很多资料,很少有讲怎么去操作读写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 上这两个讨论:

* Write single CSV file using spark-csv
<http://stackmirror.caup.cn/page/s0xamr7zg6cw>
* How to export data from Spark SQL to CSV
<http://stackmirror.caup.cn/page/s0xbsmofmibc>
发现有些网站真的是恶心,转我文章还不标准出处
版权声明:本文为博主原创文章,未经博主允许不得转载。
https://blog.csdn.net/lzw2016/article/details/85562172
<https://blog.csdn.net/lzw2016/article/details/85562172>