Spark-SQL学习笔记_总结和拓展

一、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()

            

猜你喜欢

转载自blog.csdn.net/weixin_40845957/article/details/84954959
今日推荐