最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SparkSQL使用快速入門

 更新時間:2022年02月08日 14:41:09   作者:Frankdeng  
spark SQL是spark的一個模塊,主要用于進(jìn)行結(jié)構(gòu)化數(shù)據(jù)的處理。它提供的最核心的編程抽象就是DataFrame。這篇文章主要介紹了SparkSQL使用快速入門,需要的朋友可以參考下

一、SparkSQL的進(jìn)化之路

1.0以前: Shark

1.1.x開始:SparkSQL(只是測試性的) SQL

1.3.x: SparkSQL(正式版本)+Dataframe

1.5.x: SparkSQL 鎢絲計(jì)劃

1.6.x: SparkSQL+DataFrame+DataSet(測試版本)

2.x:

  • SparkSQL+DataFrame+DataSet(正式版本)
  •      SparkSQL:還有其他的優(yōu)化
  •      StructuredStreaming(DataSet)

Spark on Hive和Hive on Spark

  • Spark on Hive:Hive只作為儲存角色,Spark負(fù)責(zé)sql解析優(yōu)化,執(zhí)行。
  • Hive on Spark:Hive即作為存儲又負(fù)責(zé)sql的解析優(yōu)化,Spark負(fù)責(zé)執(zhí)行。

二、認(rèn)識SparkSQL

2.1 什么是SparkSQL?

spark SQL是spark的一個模塊,主要用于進(jìn)行結(jié)構(gòu)化數(shù)據(jù)的處理。它提供的最核心的編程抽象就是DataFrame。

2.2 SparkSQL的作用

提供一個編程抽象(DataFrame) 并且作為分布式 SQL查詢引擎

DataFrame:它可以根據(jù)很多源進(jìn)行構(gòu)建,包括:結(jié)構(gòu)化的數(shù)據(jù)文件,hive中的表,外部的關(guān)系型數(shù)據(jù)庫,以及RDD

2.3 運(yùn)行原理

將Spark SQL轉(zhuǎn)化為RDD,然后提交到集群執(zhí)行

2.4 特點(diǎn)

(1)容易整合

(2)統(tǒng)一的數(shù)據(jù)訪問方式

(3)兼容 Hive

(4)標(biāo)準(zhǔn)的數(shù)據(jù)連接

2.5 SparkSession

SparkSession是Spark 2.0引如的新概念。SparkSession為用戶提供了統(tǒng)一的切入點(diǎn),來讓用戶學(xué)習(xí)spark的各項(xiàng)功能。
  在spark的早期版本中,SparkContext是spark的主要切入點(diǎn),由于RDD是主要的API,我們通過sparkcontext來創(chuàng)建和操作RDD。對于每個其他的API,我們需要使用不同的context。例如,對于Streming,我們需要使用StreamingContext;對于sql,使用sqlContext;對于Hive,使用hiveContext。但是隨著DataSet和DataFrame的API逐漸成為標(biāo)準(zhǔn)的API,就需要為他們建立接入點(diǎn)。所以在spark2.0中,引入SparkSession作為DataSet和DataFrame API的切入點(diǎn),SparkSession封裝了SparkConf、SparkContext和SQLContext。為了向后兼容,SQLContext和HiveContext也被保存下來。

  SparkSession實(shí)質(zhì)上是SQLContext和HiveContext的組合(未來可能還會加上StreamingContext),所以在SQLContext和HiveContext上可用的API在SparkSession上同樣是可以使用的。SparkSession內(nèi)部封裝了sparkContext,所以計(jì)算實(shí)際上是由sparkContext完成的。

特點(diǎn):

   ---- 為用戶提供一個統(tǒng)一的切入點(diǎn)使用Spark 各項(xiàng)功能

        ---- 允許用戶通過它調(diào)用 DataFrame 和 Dataset 相關(guān) API 來編寫程序

        ---- 減少了用戶需要了解的一些概念,可以很容易的與 Spark 進(jìn)行交互

        ---- 與 Spark 交互之時不需要顯示的創(chuàng)建 SparkConf, SparkContext 以及 SQlContext,這些對象已經(jīng)封閉在 SparkSession 中

2.6 DataFrames

在Spark中,DataFrame是一種以RDD為基礎(chǔ)的分布式數(shù)據(jù)集,類似于傳統(tǒng)數(shù)據(jù)庫中的二維表格。DataFrame與RDD的主要區(qū)別在于,前者帶有schema元信息,即DataFrame所表示的二維表數(shù)據(jù)集的每一列都帶有名稱和類型。這使得Spark SQL得以洞察更多的結(jié)構(gòu)信息,從而對藏于DataFrame背后的數(shù)據(jù)源以及作用于DataFrame之上的變換進(jìn)行了針對性的優(yōu)化,最終達(dá)到大幅提升運(yùn)行時效率的目標(biāo)。反觀RDD,由于無從得知所存數(shù)據(jù)元素的具體內(nèi)部結(jié)構(gòu),Spark Core只能在stage層面進(jìn)行簡單、通用的流水線優(yōu)化。

三、RDD轉(zhuǎn)換成為DataFrame

使用spark1.x版本的方式

測試數(shù)據(jù)目錄:spark/examples/src/main/resources(spark的安裝目錄里面)

people.txt

3.1通過case class創(chuàng)建DataFrames(反射)

//定義case class,相當(dāng)于表結(jié)構(gòu)
case class People(var name:String,var age:Int)
object TestDataFrame1 {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("RDDToDataFrame").setMaster("local")
    val sc = new SparkContext(conf)
    val context = new SQLContext(sc)
    // 將本地的數(shù)據(jù)讀入 RDD, 并將 RDD 與 case class 關(guān)聯(lián)
    val peopleRDD = sc.textFile("E:\\666\\people.txt")
      .map(line => People(line.split(",")(0), line.split(",")(1).trim.toInt))
    import context.implicits._
    // 將RDD 轉(zhuǎn)換成 DataFrames
    val df = peopleRDD.toDF
    //將DataFrames創(chuàng)建成一個臨時的視圖
    df.createOrReplaceTempView("people")
    //使用SQL語句進(jìn)行查詢
    context.sql("select * from people").show()
  }
}

運(yùn)行結(jié)果

3.2通過structType創(chuàng)建DataFrames(編程接口)

object TestDataFrame2 {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("TestDataFrame2").setMaster("local")
    val sc = new SparkContext(conf)
    val sqlContext = new SQLContext(sc)
    val fileRDD = sc.textFile("E:\\666\\people.txt")
    // 將 RDD 數(shù)據(jù)映射成 Row,需要 import org.apache.spark.sql.Row
    val rowRDD: RDD[Row] = fileRDD.map(line => {
      val fields = line.split(",")
      Row(fields(0), fields(1).trim.toInt)
    })
    // 創(chuàng)建 StructType 來定義結(jié)構(gòu)
    val structType: StructType = StructType(
      //字段名,字段類型,是否可以為空
      StructField("name", StringType, true) ::
      StructField("age", IntegerType, true) :: Nil
    )
    /**
      * rows: java.util.List[Row],
      * schema: StructType
      * */
    val df: DataFrame = sqlContext.createDataFrame(rowRDD,structType)
    df.createOrReplaceTempView("people")
    sqlContext.sql("select * from people").show()
  }
}

運(yùn)行結(jié)果

3.3通過 json 文件創(chuàng)建DataFrames

object TestDataFrame3 {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("TestDataFrame2").setMaster("local")
    val sc = new SparkContext(conf)
    val sqlContext = new SQLContext(sc)
    val df: DataFrame = sqlContext.read.json("E:\\666\\people.json")
    df.createOrReplaceTempView("people")
    sqlContext.sql("select * from people").show()
  }
}

四、DataFrame的read和save和savemode

4.1 數(shù)據(jù)的讀取

object TestRead {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("TestDataFrame2").setMaster("local")
    val sc = new SparkContext(conf)
    val sqlContext = new SQLContext(sc)
    //方式一
    val df1 = sqlContext.read.json("E:\\666\\people.json")
    val df2 = sqlContext.read.parquet("E:\\666\\users.parquet")
    //方式二
    val df3 = sqlContext.read.format("json").load("E:\\666\\people.json")
    val df4 = sqlContext.read.format("parquet").load("E:\\666\\users.parquet")
    //方式三,默認(rèn)是parquet格式
    val df5 = sqlContext.load("E:\\666\\users.parquet")
  }
}

4.2 數(shù)據(jù)的保存

object TestSave {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("TestDataFrame2").setMaster("local")
    val sc = new SparkContext(conf)
    val sqlContext = new SQLContext(sc)
    val df1 = sqlContext.read.json("E:\\666\\people.json")
    //方式一
    df1.write.json("E:\\111")
    df1.write.parquet("E:\\222")
    //方式二
    df1.write.format("json").save("E:\\333")
    df1.write.format("parquet").save("E:\\444")
    //方式三
    df1.write.save("E:\\555")

  }
}

4.3 數(shù)據(jù)的保存模式

使用mode

df1.write.format("parquet").mode(SaveMode.Ignore).save("E:\\444")

五、數(shù)據(jù)源

5.1 數(shù)據(jù)源只json

參考4.1

5.2 數(shù)據(jù)源之parquet

參考4.1

5.3 數(shù)據(jù)源之Mysql

object TestMysql {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("TestMysql").setMaster("local")
    val sc = new SparkContext(conf)
    val sqlContext = new SQLContext(sc)

    val url = "jdbc:mysql://192.168.123.102:3306/hivedb"
    val table = "dbs"
    val properties = new Properties()
    properties.setProperty("user","root")
    properties.setProperty("password","root")
    //需要傳入Mysql的URL、表明、properties(連接數(shù)據(jù)庫的用戶名密碼)
    val df = sqlContext.read.jdbc(url,table,properties)
    df.createOrReplaceTempView("dbs")
    sqlContext.sql("select * from dbs").show()

  }
}

運(yùn)行結(jié)果

5.3 數(shù)據(jù)源之Hive

(1)準(zhǔn)備工作

在pom.xml文件中添加依賴

<!-- https://mvnrepository.com/artifact/org.apache.spark/spark-hive -->
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-hive_2.11</artifactId>
            <version>2.3.0</version>
        </dependency>

開發(fā)環(huán)境則把resource文件夾下添加hive-site.xml文件,集群環(huán)境把hive的配置文件要發(fā)到$SPARK_HOME/conf目錄下

<configuration>
        <property>
                <name>javax.jdo.option.ConnectionURL</name>
                <value>jdbc:mysql://localhost:3306/hivedb?createDatabaseIfNotExist=true</value>
                <description>JDBC connect string for a JDBC metastore</description>
                <!-- 如果 mysql 和 hive 在同一個服務(wù)器節(jié)點(diǎn),那么請更改 hadoop02 為 localhost -->
        </property>
        <property>
                <name>javax.jdo.option.ConnectionDriverName</name>
                <value>com.mysql.jdbc.Driver</value>
                <description>Driver class name for a JDBC metastore</description>
        </property>
        <property>
                <name>javax.jdo.option.ConnectionUserName</name>
                <value>root</value>
                <description>username to use against metastore database</description>
        </property>
        <property>
                <name>javax.jdo.option.ConnectionPassword</name>
                <value>root</value>
        <description>password to use against metastore database</description>
        </property>
    <property>
                <name>hive.metastore.warehouse.dir</name>
                <value>/hive/warehouse</value>
                <description>hive default warehouse, if nessecory, change it</description>
        </property>  
</configuration>

(2)測試代碼

object TestHive {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setMaster("local").setAppName(this.getClass.getSimpleName)
    val sc = new SparkContext(conf)
    val sqlContext = new HiveContext(sc)
    sqlContext.sql("select * from myhive.student").show()
  }
}

運(yùn)行結(jié)果

六、SparkSQL 的元數(shù)據(jù)

1.1元數(shù)據(jù)的狀態(tài)

SparkSQL 的元數(shù)據(jù)的狀態(tài)有兩種:

1、in_memory,用完了元數(shù)據(jù)也就丟了

2、hive , 通過hive去保存的,也就是說,hive的元數(shù)據(jù)存在哪兒,它的元數(shù)據(jù)也就存在哪兒。

換句話說,SparkSQL的數(shù)據(jù)倉庫在建立在Hive之上實(shí)現(xiàn)的。我們要用SparkSQL去構(gòu)建數(shù)據(jù)倉庫的時候,必須依賴于Hive。

2.2Spark-SQL腳本

如果用戶直接運(yùn)行bin/spark-sql命令。會導(dǎo)致我們的元數(shù)據(jù)有兩種狀態(tài):

1、in-memory狀態(tài):如果SPARK-HOME/conf目錄下沒有放置hive-site.xml文件,元數(shù)據(jù)的狀態(tài)就是in-memory

2、hive狀態(tài):如果我們在SPARK-HOME/conf目錄下放置了,hive-site.xml文件,那么默認(rèn)情況下,spark-sql的元數(shù)據(jù)的狀態(tài)就是hive.

到此這篇關(guān)于SparkSQL使用快速入門的文章就介紹到這了,更多相關(guān)SparkSQL使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一定要讓你搞懂Java位運(yùn)算符

    一定要讓你搞懂Java位運(yùn)算符

    這篇文章主要為大家介紹了Java位運(yùn)算符,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • 一文徹底搞懂Java日期時間類詳解

    一文徹底搞懂Java日期時間類詳解

    這篇文章主要給大家介紹了關(guān)于Java日期時間類的相關(guān)資料,Calendar類的功能要比Date類強(qiáng)大很多,可以方便的進(jìn)行日期的計(jì)算,獲取日期中的信息時考慮了時區(qū)等問題,需要的朋友可以參考下
    2023-10-10
  • java 完全二叉樹的構(gòu)建與四種遍歷方法示例

    java 完全二叉樹的構(gòu)建與四種遍歷方法示例

    本篇文章主要介紹了java 完全二叉樹的構(gòu)建與四種遍歷方法示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • Spring中Bean的作用域與生命周期詳解

    Spring中Bean的作用域與生命周期詳解

    這篇文章主要給大家介紹了Spring中Bean的生命周期和作用域及實(shí)現(xiàn)方式的相關(guān)資料,文中介紹的非常詳細(xì),對大家具有一定的參考價值,需要的朋友們下面來一起看看吧
    2021-08-08
  • Springboot重寫addInterceptors()方法配置攔截器實(shí)例

    Springboot重寫addInterceptors()方法配置攔截器實(shí)例

    這篇文章主要介紹了Springboot重寫addInterceptors()方法配置攔截器實(shí)例,spring?boot拋棄了復(fù)雜的xml配置,我們可以自定義配置類(標(biāo)注@Configuration注解的類)來實(shí)現(xiàn)WebMvcConfigurer接口,并重寫addInterceptors()方法來配置攔截器,需要的朋友可以參考下
    2023-09-09
  • SpringBoot自動配置深入探究實(shí)現(xiàn)原理

    SpringBoot自動配置深入探究實(shí)現(xiàn)原理

    在springboot的啟動類中可以看到@SpringBootApplication注解,它是SpringBoot的核心注解,也是一個組合注解。其中@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan三個注解尤為重要。今天我們就來淺析這三個注解的含義
    2022-08-08
  • 詳解Spring Boot 目錄文件結(jié)構(gòu)

    詳解Spring Boot 目錄文件結(jié)構(gòu)

    這篇文章主要介紹了Spring Boot 目錄文件結(jié)構(gòu)的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • SpringMvc web.xml配置實(shí)現(xiàn)原理過程解析

    SpringMvc web.xml配置實(shí)現(xiàn)原理過程解析

    這篇文章主要介紹了SpringMvc web.xml配置實(shí)現(xiàn)原理過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • servlet Cookie使用方法詳解(六)

    servlet Cookie使用方法詳解(六)

    這篇文章主要為大家詳細(xì)介紹了servlet Cookie的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • swagger中如何給請求添加header

    swagger中如何給請求添加header

    這篇文章主要介紹了swagger中如何給請求添加header,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06

最新評論

东源县| 鄄城县| 巍山| 姚安县| 观塘区| 乐都县| 荆门市| 凌云县| 宜昌市| 迁安市| 保定市| 盐城市| 乌兰察布市| 建平县| 社会| 六盘水市| 三穗县| 偃师市| 江门市| 兴仁县| 温宿县| 托里县| 长春市| 新竹县| 五原县| 石嘴山市| 湖州市| 神农架林区| 盖州市| 海门市| 且末县| 武陟县| 徐汇区| 蒙山县| 视频| 齐齐哈尔市| 弋阳县| 惠东县| 新竹县| 远安县| 皋兰县|