spark_note06_sparkSQL_1

(一)sparkSQL

sparkSQL是什么

sparkSQL是apache spark的一个处理结构化数据的模块

它提供了一个编程抽象叫做DataFrame 并且作为分布式sql查询引擎的作用

sparkSQL四大特性

  • 1.易整合
    • 可以将sparksql与spark应用程序进行混合使用
    • 并且可以使用java、scala、python、R等不同语言进行代码开发
  • 2.统一的数据源访问
    • sparksql可以使用一种相同的方式跟不同的外部数据源进行对接
    • SparkSession.read.文件格式(“该文件的路径”)
  • 3.兼容hive
    • sparksql支持hivesql的语法
  • 4.支持标准数据库连接
    • sparksql可以使用标准的jdbc或者odbc连接上数据库

(二)DataFrame

什么是DataFrame

DataFrame以RDD为基础的分布式数据集

类似于传统数据库的二维表格,DataFrame带有Schema元信息,即DataFrame所表示的二维数据表的每一列都带有名称和类型,但底层做了更多的优化。

DataFrame可以从很多数据源构建,比如已经存在的RDD、结构化文件、外部数据库、hive表。

rdd与dataframe优缺点对比

  • rdd

    • 优点
      • 1.编译时类型安全
        • 就是后期再编译rdd代码的时候,会进行类型检查
      • 2.具有面向对象的编程风格
        • 可以使用对象调用方法的形式去操作对象
    • 缺点
      • 1.数据对象序列化和反序列化性能开销很大
        • spark任务通过分布式计算实现,后期大量的task运行,需要大量的数据网络传输。
      • 2.大量的对象创建会带来大量的GC(垃圾回收)
        • 在通过rdd进行编程的时候可能会创建大量对象,这些对象都是构建在jvm堆里的,需战大量内存空间,后期内存不足会导致频繁GC,GC结束后,任务继续运行。
  • DataFrame

    • 它分别引入了schema和off-heap解决了rdd的缺点,同时也丢失了rdd的优点

    • 优点

      • 1.schema:就是对数据结构信息的描述。后期这里数据在进行网络传输的时候,只需要序列化数据本身就可以了,性能得到提升;

        它是解决了rdd中数据对象序列化和反序列化性能开销很大这个缺点。

      • 2.off-heap:不在jvm堆内存中构建对象,使用操作系统层面上的内存,不会频繁导致gc;

        解决了rdd大量的对象创建会带来大量的GC这个缺点。

    • DataFrame解决了rdd的缺点,同时也丢失了rdd的优点

      • 1.DataFrame编译时类型不安全
      • 2.DataFrame不具备面向对象编程风格

读取数据源构建DataFrame

1.读取文本文件构建DataFrame

​ val df=spark.read.text("/sparkdata/input/word.txt")

​ //打印schema

​ df.printSchema

​ //展示数据

​ df.show

2.读取json文件构建DataFrame

​ val df=spark.read.json("/sparkdata/input/person.json")

​ //打印schema

​ df.printSchema

​ //展示数据

​ df.show

3.读取parquet列式存储文件构建DataFrame

​ val df=spark.read.parquet("/sparkdata/input/users.parquet")

​ //打印schema

​ df.printSchema

​ //展示数据

​ df.show

实例

scala> val df=spark.read.text("/sparkdata/input/word.txt")
df: org.apache.spark.sql.DataFrame = [value: string]

scala> df.printSchema
root
 |-- value: string (nullable = true)

scala> df.show
+------------------+
|             value|
+------------------+
|spark hadoop hbase|
|      hadoop spark|
|             hello|
+------------------+

scala> 

DataFrame常用操作

1.DSL风格语法
  • dataframe自身提供了一套api,可以通过这套api去操作它

    val rdd1=sc.textFile("/person.txt")
    val rdd2=rdd1.map(_.split(" "))
    //抽象类
    case class Person(id:Int,name:String,age:Int)
    val rdd3=rdd2.map(x=>Person(x(0).toInt,x(1),x(2).toInt))
    
    val df=rdd3.toDF
    
    df.printSchema
    df.show
    
    df.select("name").show
    df.select($"name").show
    df.select(col("name")).show
    df.select("name","age").show
    
    df.select($"age"+1).show
    df.filter($"age">30).show
    df.filter($"age">30).show
    df.groupBy("age").count.show
    
    
2.SQL风格语法
  • 就是可以把datFrame看成是一张表

    • 需要把dataframe注册成一张表

      //spark-shell
      df.createTempView("person")
      
    • SparkSession.sql (sql语句)

      spark.sql("select * from person").show
      spark.sql("select * from person where id=1").show
      spark.sql("select count(*) from person where age>30").show
      
      //IDEA依赖包
        <dependency>
             <groupId>org.apache.spark</groupId>
             <artifactId>spark-sql_${scala.binary.version}</artifactId>
             <version>2.2.0</version>
        </dependency>
      

(三)DataSet

dataset是什么

dataset是分布式的数据集合

它提供了强类型支持,也是在rdd的每行数据加了类型约束。

spark1.6之后的接口。

它集中了rdd的优点(强类型和可以用强大的lambda函数)以及使用了spark sql优化的执行引擎。

DataSet和DataFrame互相转换

  • 1.DataFrame------>DataSet
    • val ds=df.as[强类型]
  • 2.DataSet-------->DataFrame
    • val df=ds.toDF
  • 补充
    • 可以使用DataFrame和DataSet分别调用各自rdd方法,将其转换为一个rdd

如何构建DataSet

  • 1、从一个已经存在的scala集合去构建

    scala> val ds=spark.createDataset(List(1,2,3,4))
    
    scala> val ds=List(1,2,3,4).toDS
    
    
  • 2、从一个已经存在的rdd去构建

    scala> val ds=spark.createDataset(sc.textFile("/sparkdata/word.txt"))
    
    
  • 3、DataFrame转换成DataSet

    val ds=df.as[String]
    
  • 4、通过一个DataSet转换生成一个新的DataSet

    scala> val ds2=ds.map(x=>x+"_itcast")
    
    

(四)SparkSQL DataFrame DataSet三者的数据类型


在这里插入图片描述

附:

//spark.+TAB
scala> spark.
baseRelationToDataFrame   emptyDataset      readStream     streams   
catalog                   experimental      sessionState   table     
close                     implicits         sharedState    time      
conf                      listenerManager   sparkContext   udf       
createDataFrame           newSession        sql            version   
createDataset             range             sqlContext               
emptyDataFrame            read              stop                     

//sc.+TAB
scala> sc.
accumulable             getCheckpointDir           parallelize             
accumulableCollection   getConf                    range                   
accumulator             getExecutorMemoryStatus    register                
addFile                 getExecutorStorageStatus   removeSparkListener     
addJar                  getLocalProperty           requestExecutors        
addSparkListener        getPersistentRDDs          requestTotalExecutors   
appName                 getPoolForName             runApproximateJob       
applicationAttemptId    getRDDStorageInfo          runJob                  
applicationId           getSchedulingMode          sequenceFile            
binaryFiles             hadoopConfiguration        setCallSite             
binaryRecords           hadoopFile                 setCheckpointDir        
broadcast               hadoopRDD                  setJobDescription       
cancelAllJobs           isLocal                    setJobGroup             
cancelJob               isStopped                  setLocalProperty        
cancelJobGroup          jars                       setLogLevel             
cancelStage             killExecutor               sparkUser               
clearCallSite           killExecutors              startTime               
clearJobGroup           killTaskAttempt            statusTracker           
collectionAccumulator   listFiles                  stop                    
defaultMinPartitions    listJars                   submitJob               
defaultParallelism      longAccumulator            textFile                
deployMode              makeRDD                    uiWebUrl                
doubleAccumulator       master                     union                   
emptyRDD                newAPIHadoopFile           version                 
files                   newAPIHadoopRDD            wholeTextFiles          
getAllPools             objectFile               
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值