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文件路径