看很多资料, 很少有讲怎么去操作读写 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
发现有些网站真的是恶心, 转我文章还不标准出处
来源: http://www.bubuko.com/infodetail-2911005.html