一、Spark-SQL应用场景
1.数据文件即席查询 Ad-hoc
普通查询:定制化查询
2.对流数据文件采用SQL分析 Spark-Streaming+Spark-SQL
3.使用SQL完成ETL开发
1> 格式转换 ==>列式存储 parquet/json==>parquet
2> 日志数据清洗,把日志一部分内容抽取出来做分析统计
2.1> 添加字段 ip=>城市
2.2> 日期字段 转换成分区字段
2.3> 剔除不需要字段
4.与外部数据源做交互查询操作 外部数据源API!!!
传统:通过sqoop把数据抽取到数据平台上去
然后注册成Hive表,进行统计分析
进阶:Spark-SQL
把外部数据源中的表注册成DataFrame
通过DataFrame API进行统计分析
5.集群查询性能拓展
spark on yarn 开发
spark local模式 测试
二、加载数据
1.直接加载到dataframe/dataset
2.加载到RDD进行转换
3.从本地或云端(HDFS/S3)加载数据
1>将数据加载成RDD
val masterLog = sc.textFile("file://")
val workerLog = sc.textFile("file://")
val allLog=sc.textFile("file://*out*")
masterLog.count
masterLog.collect
masterLog.collect.foreach(println)
workerLog.count
allLog.count
问题:使用SQL进行查询?
2>RDD==>DataFrame(DataFrame编程)
import org.apache.spark.sql.Row
val masterRDD = masterLog.map(x => Row(x))
import org.apache.spark.sql.types._
val schemaString = "line"
val fields = schemaString.split(" ").map(fieldName => StructField(fieldName, StringType, nullable = true))
val schema = StructType(fields)
val masterDF = spark.createDataFrame(masterRDD, schema)
masterDF.show(false)
masterDF.printSchema
3>RDD==>DataFrame(sql方式)
masterDF.createOrReplaceTempView(master_logs)
spark.sql("select * from master_logs limit 10").show(false)
三、外部数据源 (json/parquet)
DataFrame编程
val usersDF=spark.read.format("parquet").load("file://users.parquet")
DataFrame sql
spark.sql("").show(false)
spark.sql("select * from parquet.``")
Drill 大数据处理框架
四、从云端读取数据(HDFS/s3a/s3n)
val hdfsRDD=sc.textFile("hdfs://path/file")
val s3RDD=sc.textFile("s3a://bucket/object")
spark.read.format("text").load("")
五、DataFrame vs SQL
1> DataFrame=RDD+schema
2> dataset in Row =DataFrame
3> DataFrame over rdd=Catalyst优化+schema
4> DataFrame text json parquet ...
5> DataFrame=SQLAPI +DataFrame API (Catalyst优化)
六、schema
inferred 隐式 显示
数据仓库开发:
1> spark操作hive
2> 列式存储
3>自动推导无需指定schema信息
七、Save Results
SavaMode(Spark官网)
Spark默认snappy压缩格式-parquet
1> ErrorIfExists
2> Append
3> Ignore
4> Overwrite
val df=spark.read.format("json").
load("file://people.json")
df.show
df.select("name").write.format("parquet")
.mode("overwrite").save("file:///home/hadoop/data/overwrite")
spark.read.format("parquet").load("file:///home/hadoop/data/overwrite")
八、处理json数据
支持schema信息自动推导
val json
=spark.read.format("json").load("file://test.json")
json.show
json.createOrReplaceTempView("json_table")
spark.sql("select * from json_table").show
spark.sql("select name,nums[1] from json_table").show
spark.sql("select name,explode(nums)from json_table").show
spark.sql("select name,address.city,address.state from json_table2").show
九、Spark-SQL中SQL覆盖度
1> 1.6(支持SQL一半)
不支持TPC-DS
2> 2.0(支持SQL2003,支持TPC—DS)
支持子查询
支持向量化 一次读1024行
外部数据源
rdbms JDBC jars
parquet Phoenix csv avro
十、补充
JDBC数据源API源码解析
1> abstract class BaseRelation
定义schema信息
2> trait RelationProvider
创建BaseRelation
Scan Scan==>RDD-Row
val df =spark.read.format("").option("path","file:///").load()