Spark读写csv,txt,json,xlsx,xml,avro文件
- 1. Spark读写csv文件
- 2. Spark读写txt文件
- 3. Spark读写json文件
- 4. Spark读写excel文件
- 5. Spark读写xml文件
- 6. Spark读取avro文件
Spark读取文本文件时,面对繁多的文件格式,是一件很让人头疼的事情,幸好databricks提供了丰富的api来进行解析,我们只需要引入相应的依赖包,使用Spark SqlContext来进行读取和解析,即可得到格式化好的数据。
下面我们讲述spark从hdfs读写解析常见的几种文本文件的方式。
1. Spark读写csv文件
- 需引入的外部jar包
<dependency>
<groupId>com.databricks</groupId>
<artifactId>spark-csv_2.11</artifactId>
<version>1.4.0</version>
</dependency>
- 读取csv文件核心代码
import org.apache.spark.sql.SQLContext
val sqlContext = new SQLContext(sc)
sqlContext.read
.format("com.databricks.spark.csv")
.option("delimiter", ",") // 字段分割符
.option("header", "true") // 是否将第一行作为表头header
.option("inferSchema", "false") //是否自动推段内容的类型
.option("codec", "none") // 压缩类型
.load(csvFile) // csv文件所在hdfs路径 + 文件名
- DataFrame加载为csv文件核心代码
df.write.format("com.databricks.spark.csv")
.option("header", "true")
.option("codec", "none")
.save(tempHdfsPath) //落地文件hdfs路径,需提前创建路径
- spark-csv项目源码
https://github.com/databricks/spark-csv
2. Spark读写txt文件
- hdfs目录下/home/test/testTxt.txt文件内容
a,b,c,d
123,345,789,5
34,45,90,9878
- 读取txt文件核心代码
scala> sqlContext.read.text("/home/test/testTxt.txt").show
+-------------+
| value|
+-------------+
| a,b,c,d|
|123,345,789,5|
|34,45,90,9878|
+-------------+
txt文件为按整行读取,如果需要获得相关字段,则需要对DataFrame的列进行拆分。
- DataFrame加载为txt文件核心代码
//获取dateframe所有的字段名
val columnArr = df.columns.map { colName =>
df.col(colName)
}
df.select(concat_ws(",", columnArr: _*) //将各列数据使用分隔符连接
.cast(StringType))
.write.format("text")
.save(tempHdfsPath) //落地文件hdfs路径,需提前创建路径
3. Spark读写json文件
- hdfs目录下/home/test/testJson.json文件内容
{"a":"1747","b":"id抽取_SDK_按小时","c":1,"d":"2018112713"}
{"a":"456","b":"232","c":10,"d":"203227324"}
- 读取json文件核心代码
scala> sqlContext.read.format("json").load("/home/test/testJson.json").show
+----+------------+---+----------+
| a| b| c| d|
+----+------------+---+----------+
|1747|id抽取_SDK_按小时| 1|2018112713|
| 456| 232| 10| 203227324|
+----+------------+---+----------+
- DataFrame加载为json文件核心代码
df.write.format("json")
.save(tempHdfsPath) //落地文件hdfs路径,需提前创建路径
4. Spark读写excel文件
- 需引入的外部jar包
<dependency>
<groupId>com.crealytics</groupId>
<artifactId>spark-excel_2.11</artifactId>
<version>0.12.2</version>
</dependency>
- 读取xlsx|xls文件核心代码
import org.apache.spark.sql._
val spark: SparkSession = ???
val df = spark.read
.format("com.crealytics.spark.excel")
.option("useHeader", "true") // 是否将第一行作为表头
.option("inferSchema", "false") // 是否推断schema
.option("workbookPassword", "None") // excel文件的打开密码
.load(excelFile) //excel文件路径 + 文件名
- DataFrame加载为xlsx|xls文件核心代码
df.write.format("com.crealytics.spark.excel")
.option("useHeader", "true")
.option("timestampFormat", "MM-dd-yyyy HH:mm:ss")
.option("inferSchema", "false")
.option("workbookPassword", "None")
.save(tempHdfsPath) //落地文件hdfs路径,需提前创建路径
- spark-excel项目源码
https://github.com/crealytics/spark-excel
5. Spark读写xml文件
- test.xml文件
<catalog>
<testXml id="tx101">
<a>Tove</a>
<b>Jani</b>
<c>Reminder</c>
<d>Don't forget me this weekend!</d>
</testXml>
<testXml id="tx102">
<a>ksdhf</a>
<b>Jasfdi</b>
<c>Re</c>
<d>Don't forget me</d>
</testXml>
</catalog>
- 需引入的外部jar包
<dependency>
<groupId>com.databricks</groupId>
<artifactId>spark-xml_2.11</artifactId>
<version>0.6.0</version>
</dependency>
- 读取xml文件核心代码
import org.apache.spark.sql._
val spark: SparkSession = ???
val df = spark.read
.format("com.databricks.spark.xml")
.option("rowTag", "testXml") // xml文件rowTag,分行标识,"testXml"即为上文rowTag
.load(xmlFile) //xml文件路径+文件名
- DataFrame加载为xml文件核心代码
df.write.format("com.databricks.spark.xml")
.option("rowTag", "testXml")
.option("rootTag", "catalog")
.save(tempHdfsPath) //落地文件hdfs路径,需提前创建路径
- spark-xml项目源码
https://github.com/databricks/spark-xml
6. Spark读取avro文件
- 需引入的外部jar包
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-avro_2.11</artifactId>
<version>2.4.4</version>
</dependency>
- 读取avro文件核心代码
import org.apache.spark.sql._
val spark: SparkSession = ???
spark.conf.set("spark.sql.avro.compression.codec", "deflate") //设置avro文件压缩方式
spark.conf.set("spark.sql.avro.deflate.level", "2")
val df: DataFrame = spark.read
.format("avro")
.option("avroSchema", "/.../.../test.avsc") //设置avsc格式的avro文件字段信息
.load(avroFilePath) //指定avro文件路径