文章目录
产生背景
每个Spark应用程序从读取数据开始,到保存数据结束
- 加载和保存数据是不容易的
比如大数据场景解析关系型数据库需要用工具如sqoop将数据转到hbase等。 - 解析原始数据也不容易 :text/json/parquet
- 数据直接的转换也麻烦
- 数据集存储在各个存储系统中无法统一拉取和推送
用户的需要:
方便快速从不同的数据源(json、parquet、rdbms),经过混合处理(json join parquet),再将处理结果以特定的格式(json、parquet)写回到指定的系统(HDFS、S3)上去
Spark SQL 1.2 ==> 外部数据源API
概念
External Data Source API
- 一种集成各种外部数据的扩展方法
- 可以使用各种格式和存储系统读写DataFrame
- Data Source API可以自动裁剪列和推送过滤器到源(谓词下推):parquet/JDBO
- Data Source API在Spark 1.2提出
目标
- 对于开发人员只需要构建针对外部数据源的库
开发人员:是否需要把代码合并到spark中????
比如weibo数据只需要通过–jars传入就行。 - 对于使用人员通过DataFrames很容易加载和保持数据源
用户
读:spark.read.format(format)
format
build-in:内置的 json parquet jdbc csv(2.0+后属于内置)
packages: 外部的比如微博的数据 并不是spark内置 https://spark-packages.org/
写:people.write.format(“parquet”).save(“path”)
操作Parquet文件数据
parquet是无法直接查看的;所以这里就不提供数据了
- spark.read.format(“parquet”).load(path)
- df.write.format(“parquet”).save(path)
package com.kun.ExternalDataSource
import org.apache.spark.sql.SparkSession
/**
* Parquet文件操作
*/
object ParquetApp {
def main(args: Array[String]) {
val spark = SparkSession.builder().appName("SparkSessionApp")
.master("local[2]").getOrCreate()
/**
* spark.read.format("parquet").load 这是标准写法
*/
val userDF = spark.read.format("parquet").load("file:///home/hadoop/app/spark-2.1.0-bin-2.6.0-cdh5.7.0/examples/src/main/resources/users.parquet")
userDF.printSchema()
userDF.show()
userDF.select("name","favorite_color").show
userDF.select("name","favorite_color").write.format("json").save("file:///home/hadoop/tmp/jsonout")
spark.read.load("file:///home/hadoop/app/spark-2.1.0-bin-2.6.0-cdh5.7.0/examples/src/main/resources/users.parquet").show
//会报错,因为sparksql默认处理的format就是parquet
spark.read.load("file:///home/hadoop/app/spark-2.1.0-bin-2.6.0-cdh5.7.0/examples/src/main/resources/people.json").show
spark.read.format("parquet"