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

SparkSQL快速入門(mén)教程

 更新時(shí)間:2022年02月08日 14:51:28   作者:Java魚(yú)仔  
Spark?SQL是Spark用于結(jié)構(gòu)化數(shù)據(jù)(structured?data)處理的Spark模塊,今天通過(guò)本文給大家介紹SparkSQL快速入門(mén)教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧

(一)概述

SparkSQL可以理解為在原生的RDD上做的一層封裝,通過(guò)SparkSQL可以在scala和java中寫(xiě)SQL語(yǔ)句,并將結(jié)果作為Dataset/DataFrame返回。簡(jiǎn)單來(lái)講,SparkSQL可以讓我們像寫(xiě)SQL一樣去處理內(nèi)存中的數(shù)據(jù)。

Dataset是一個(gè)數(shù)據(jù)的分布式集合,是Spark1.6之后新增的接口,它提供了RDD的優(yōu)點(diǎn)和SparkSQL優(yōu)化執(zhí)行引擎的優(yōu)點(diǎn),一個(gè)Dataset相當(dāng)于RDD+Schema的結(jié)合。

Dataset的底層封裝是RDD,當(dāng)RDD的泛型是Row類(lèi)型時(shí),該類(lèi)型就可以稱(chēng)為DataFrame。DataFrame是一種表格型的數(shù)據(jù)結(jié)構(gòu),就和傳統(tǒng)的Mysql結(jié)構(gòu)一樣,通過(guò)DataFrame我們可以更加高效地去執(zhí)行Sql。

特點(diǎn)

  • 易整合,在程序中既可以使用SQL,還可以使用API!
  • 統(tǒng)一的數(shù)據(jù)訪(fǎng)問(wèn), 不同數(shù)據(jù)源中的數(shù)據(jù),都可以使用SQL或DataFrameAPI進(jìn)行操作,還可以進(jìn)行不同數(shù)據(jù)源的Join!
  • 對(duì)Hive的無(wú)縫支持
  • 支持標(biāo)準(zhǔn)的JDBC和ODBC

(二)SparkSQL實(shí)戰(zhàn)

使用SparkSQL首先需要引入相關(guān)的依賴(lài):

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-sql_2.12</artifactId>
    <version>3.0.0</version>
</dependency>

該依賴(lài)需要和sparkCore保持一致。

SparkSQL的編碼主要通過(guò)四步:

  • 創(chuàng)建SparkSession
  • 獲取數(shù)據(jù)
  • 執(zhí)行SQL
  • 關(guān)閉SparkSession
public class SqlTest {
    public static void main(String[] args) {
        SparkSession sparkSession = SparkSession.builder()
                .appName("sql")
                .master("local")
                .getOrCreate();
        Dataset<Row> json = sparkSession.read().json("data/json");
        json.printSchema();
        json.show();
        sparkSession.stop();
    }
}

在data的目錄下創(chuàng)建一個(gè)名為json的文件

{"name":"a","age":23}
{"name":"b","age":24}
{"name":"c","age":25}
{"name":"d","age":26}
{"name":"e","age":27}
{"name":"f","age":28}

運(yùn)行項(xiàng)目后輸出兩個(gè)結(jié)果,schema結(jié)果如下:

Dataset<Row>輸出結(jié)果如下:

通過(guò)SparkSQL可以執(zhí)行和SQL十分相似的查詢(xún)操作:

public class SqlTest {
    public static void main(String[] args) {
        SparkSession sparkSession = SparkSession.builder()
                .appName("sql")
                .master("local")
                .getOrCreate();
        Dataset<Row> json = sparkSession.read().json("data/json");
        json.select("age","name").where("age > 26").show();
        sparkSession.stop();
    }
}

在上面的語(yǔ)句中,通過(guò)一系列的API實(shí)現(xiàn)了SQL查詢(xún)操作,除此之外,SparkSQL還支持直接寫(xiě)原始SQL語(yǔ)句的操作。

在寫(xiě)SQL語(yǔ)句之前,首先需要讓Spark知道對(duì)哪個(gè)表進(jìn)行查詢(xún),因此需要建立一張臨時(shí)表,再執(zhí)行SQL查詢(xún):

json.createOrReplaceTempView("json");
sparkSession.sql("select * from json where age > 26").show();

(三)非JSON格式的Dataset創(chuàng)建

在上一節(jié)中創(chuàng)建Dataset時(shí)使用了最簡(jiǎn)單的json,因?yàn)閖son自己帶有schema結(jié)構(gòu),因此不需要手動(dòng)去增加,如果是一個(gè)txt文件,就需要在創(chuàng)建Dataset時(shí)手動(dòng)塞入schema。

下面展示讀取txt文件的例子,首先創(chuàng)建一個(gè)user.txt

a 23
b 24
c 25
d 26

現(xiàn)在我要將上面的這幾行變成DataFrame,第一列表示姓名,第二列表示年齡,于是就可以像下面這樣操作:

public class SqlTest2 {
    public static void main(String[] args) {
        SparkSession sparkSession = SparkSession.builder()
                .appName("sql")
                .master("local")
                .getOrCreate();
        SparkContext sparkContext = sparkSession.sparkContext();
        JavaSparkContext sc = new JavaSparkContext(sparkContext);
        JavaRDD<String> lines = sc.textFile("data/user.txt");
        //將String類(lèi)型轉(zhuǎn)化為Row類(lèi)型
        JavaRDD<Row> rowJavaRDD = lines.map(new Function<String, Row>() {
            @Override
            public Row call(String v1) throws Exception {
                String[] split = v1.split(" ");
                return RowFactory.create(
                        split[0],
                        Integer.valueOf(split[1])
                );
            }
        });
        //定義schema
        List<StructField> structFields = Arrays.asList(
                DataTypes.createStructField("name", DataTypes.StringType, true),
                DataTypes.createStructField("age", DataTypes.IntegerType, true)
        );
        StructType structType = DataTypes.createStructType(structFields);
        //生成dataFrame
        Dataset<Row> dataFrame = sparkSession.createDataFrame(rowJavaRDD, structType);
        dataFrame.show();
    }
}

(四)通過(guò)JDBC創(chuàng)建DataFrame

通過(guò)JDBC可直接將對(duì)應(yīng)數(shù)據(jù)庫(kù)中的表放入Spark中進(jìn)行一些處理,下面通過(guò)MySQL進(jìn)行展示。
使用MySQL需要在依賴(lài)中引入MySQL的引擎:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.46</version>
</dependency>

接著通過(guò)類(lèi)似JDBC的方式讀取MySQL數(shù)據(jù):

public class SqlTest3 {
    public static void main(String[] args) {
        SparkSession sparkSession = SparkSession.builder()
                .appName("sql")
                .master("local")
                .getOrCreate();
        Map<String,String> options = new HashMap<>();
        options.put("url","jdbc:mysql://127.0.0.1:3306/books");
        options.put("driver","com.mysql.jdbc.Driver");
        options.put("user","root");
        options.put("password","123456");
        options.put("dbtable","book");
        Dataset<Row> jdbc = sparkSession.read().format("jdbc").options(options).load();
        jdbc.show();
        sparkSession.close();
    }
}

讀取到的數(shù)據(jù)是DataFrame,接下來(lái)的操作就是對(duì)DataFrame的操作了。

(五)總結(jié)

SparkSQL是對(duì)Spark原生RDD的增強(qiáng),雖然很多功能通過(guò)RDD就可以實(shí)現(xiàn),但是SparkSQL可以更加靈活地實(shí)現(xiàn)一些功能。

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

相關(guān)文章

  • 數(shù)組在java中的擴(kuò)容的實(shí)例方法

    數(shù)組在java中的擴(kuò)容的實(shí)例方法

    在本篇文章里小編給大家分享的是一篇關(guān)于數(shù)組在java中的擴(kuò)容的實(shí)例方法內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-01-01
  • Java實(shí)現(xiàn)samza轉(zhuǎn)換成flink

    Java實(shí)現(xiàn)samza轉(zhuǎn)換成flink

    將Apache Samza作業(yè)遷移到Apache Flink作業(yè)是一個(gè)復(fù)雜的任務(wù),因?yàn)檫@兩個(gè)流處理框架有不同的API和架構(gòu),本文我們就來(lái)看看如何使用Java實(shí)現(xiàn)samza轉(zhuǎn)換成flink吧
    2024-11-11
  • Java反射概念與使用實(shí)例代碼

    Java反射概念與使用實(shí)例代碼

    JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類(lèi),都能夠知道這個(gè)類(lèi)的所有屬性和方法,下面這篇文章主要給大家介紹了關(guān)于Java反射概念與使用的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • SpringBoot整合Redis實(shí)現(xiàn)熱點(diǎn)數(shù)據(jù)緩存的示例代碼

    SpringBoot整合Redis實(shí)現(xiàn)熱點(diǎn)數(shù)據(jù)緩存的示例代碼

    這篇文章主要介紹了SpringBoot中整合Redis實(shí)現(xiàn)熱點(diǎn)數(shù)據(jù)緩存,本文以IDEA?+?SpringBoot作為?Java中整合Redis的使用?的測(cè)試環(huán)境,結(jié)合實(shí)例代碼給大家詳細(xì)講解,需要的朋友可以參考下
    2023-03-03
  • Springboot整合nacos報(bào)錯(cuò)無(wú)法連接nacos的解決

    Springboot整合nacos報(bào)錯(cuò)無(wú)法連接nacos的解決

    這篇文章主要介紹了Springboot整合nacos報(bào)錯(cuò)無(wú)法連接nacos的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Java 數(shù)組內(nèi)置函數(shù)toArray詳解

    Java 數(shù)組內(nèi)置函數(shù)toArray詳解

    這篇文章主要介紹了Java 數(shù)組內(nèi)置函數(shù)toArray詳解,文本詳細(xì)的講解了toArray底層的代碼和文檔,需要的朋友可以參考下
    2021-06-06
  • SpringBoot中的application.properties無(wú)法加載問(wèn)題定位技巧

    SpringBoot中的application.properties無(wú)法加載問(wèn)題定位技巧

    這篇文章主要介紹了SpringBoot中的application.properties無(wú)法加載問(wèn)題定位技巧,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Java實(shí)現(xiàn)List去重的方法詳解

    Java實(shí)現(xiàn)List去重的方法詳解

    本文用示例介紹Java的List(ArrayList、LinkedList等)的去重的方法。List去重的常用方法一般是:JDK8的stream的distinct、轉(zhuǎn)為HashSet、轉(zhuǎn)為T(mén)reeSet等,感興趣的可以了解一下
    2022-05-05
  • 最新IntelliJ IDEA2017.3 激活方式

    最新IntelliJ IDEA2017.3 激活方式

    本文給大家提供最新IntelliJ IDEA2017.3 激活方式,本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • 詳解Java生成PDF文檔方法

    詳解Java生成PDF文檔方法

    這篇文章主要介紹了Java生成PDF文檔方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04

最新評(píng)論

新津县| 山西省| 石家庄市| 广灵县| 灵璧县| 五华县| 灵武市| 鄂托克旗| 龙胜| 综艺| 德昌县| 德令哈市| 镇雄县| 乃东县| 通渭县| 新郑市| 桦川县| 广河县| 富锦市| 江油市| 中阳县| 新蔡县| 金平| 微山县| 囊谦县| 罗田县| 申扎县| 平原县| 五寨县| 宁波市| 石首市| 仲巴县| 托克逊县| 商水县| 元朗区| 衡水市| 卢湾区| 亳州市| 荆门市| 闽侯县| 乌拉特中旗|