Spark SQL

概述

官方地址 http://spark.apache.org/sql/
Spark SQL是Spark用來處理結(jié)構(gòu)化數(shù)據(jù)的一個模塊笛质,它提供了2個編程抽象:DataFrame和DataSet,并且作為分布式SQL查詢引擎的作用何缓。
Spark SQL可以很好地支持SQL查詢福荸,一方面蕴坪,可以編寫Spark應(yīng)用程序使用SQL語句進行數(shù)據(jù)查詢,另一方面逞姿,也可以使用標準的數(shù)據(jù)庫連接器(比如JDBC或ODBC)連接Spark進行SQL查詢辞嗡。

DataFrame

SparkSQL使用的數(shù)據(jù)抽象是DataFrame ,DataFrame讓Spark具備了處理大數(shù)據(jù)結(jié)構(gòu)化數(shù)據(jù)的能力,它不僅比原來的RDD轉(zhuǎn)換方式更加簡單易用滞造,而且獲得了更高的計算能力续室。Spark 能夠輕松實現(xiàn)從Mysql到DataFrame的轉(zhuǎn)化,并且支持SQL查詢谒养。
DataFrame是一種以RDD為基礎(chǔ)的分布式數(shù)據(jù)集挺狰,提供了詳細的數(shù)據(jù)信息,就相當于關(guān)系數(shù)據(jù)庫的一張表买窟,每個RDD元素都是一個Java對象丰泊,即Person對象,但是無法知道Person對象的內(nèi)部結(jié)構(gòu)信息始绍,而采用DataFrame時瞳购,Person對象內(nèi)部機構(gòu)信息一目了然。它包含Name,Age,并且知道每個字段的數(shù)據(jù)類型亏推。


image.png

DataFrame創(chuàng)建

從Spark2.0以上版本開始学赛,Spark使用全新的SparkSession接口替代Spark1.6中的SQLContext及HiveContext接口來實現(xiàn)其對數(shù)據(jù)加載年堆、轉(zhuǎn)換、處理等功能盏浇。SparkSession實現(xiàn)了SQLContext及HiveContext所有功能变丧。
SparkSession支持從不同的數(shù)據(jù)源加載數(shù)據(jù),并把數(shù)據(jù)轉(zhuǎn)換成DataFrame绢掰,并且支持把DataFrame轉(zhuǎn)換成SQLContext自身中的表痒蓬,然后使用SQL語句來操作數(shù)據(jù)。SparkSession亦提供了HiveQL以及其他依賴于Hive的功能的支持滴劲。

HelloWorld

在當前工程目錄底下創(chuàng)建input目錄 創(chuàng)建測試數(shù)據(jù)文件 people.json

{"name":"Michael"}
{"name":"Andy", "age":30}
{"name":"Justin", "age":19}

maven 配置

https://mvnrepository.com/search?q=org.apache.spark

image.png

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.bx.spark</groupId>
    <artifactId>SparkNote</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <scala.version>2.11.12</scala.version>
        <spark.version>2.2.3</spark.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-library</artifactId>
            <version>${scala.version}</version>
        </dependency>


        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.11</artifactId>
            <version>${spark.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql_2.11</artifactId>
            <version>${spark.version}</version>
        </dependency>
    </dependencies>

    <build>
        <sourceDirectory>src/main/scala</sourceDirectory>
        <plugins>
            <plugin>
                <groupId>org.scala-tools</groupId>
                <artifactId>maven-scala-plugin</artifactId>
                <version>2.15.0</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                        <configuration>
                            <args>
                                <arg>-dependencyfile</arg>
                                <arg>${project.build.directory}/.scala_dependencies</arg>
                            </args>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

SparkSQL.scala

package cn.bx.spark

import org.apache.spark.sql.{DataFrame, SparkSession}

object SparkSQLNote {
  def main(args: Array[String]): Unit = {
    val sparkSession: SparkSession = SparkSession.builder().master("local[*]").getOrCreate()
    val df: DataFrame = sparkSession.read.json("input/people.json")
    df.show()
    df.printSchema()
    df.select(df("name"),df("age")).show()
    df.filter(df("age") > 20 ).show()
    df.groupBy("name").count().show()
    df.sort(df("age").desc).show()
    df.sort(df("age").desc, df("name").asc).show()
    df.select(df("name").as("user_name"),df("age").as("user_age")).show()
    sparkSession.stop()
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末攻晒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子哑芹,更是在濱河造成了極大的恐慌炎辨,老刑警劉巖捕透,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件聪姿,死亡現(xiàn)場離奇詭異,居然都是意外死亡乙嘀,警方通過查閱死者的電腦和手機末购,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來虎谢,“玉大人盟榴,你說我怎么就攤上這事∮へ” “怎么了擎场?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長几莽。 經(jīng)常有香客問我迅办,道長,這世上最難降的妖魔是什么章蚣? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任站欺,我火速辦了婚禮,結(jié)果婚禮上纤垂,老公的妹妹穿的比我還像新娘矾策。我一直安慰自己,他們只是感情好峭沦,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布贾虽。 她就那樣靜靜地躺著,像睡著了一般吼鱼。 火紅的嫁衣襯著肌膚如雪蓬豁。 梳的紋絲不亂的頭發(fā)上履磨,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天,我揣著相機與錄音庆尘,去河邊找鬼剃诅。 笑死,一個胖子當著我的面吹牛驶忌,可吹牛的內(nèi)容都是我干的矛辕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼付魔,長吁一口氣:“原來是場噩夢啊……” “哼聊品!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起几苍,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤翻屈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后妻坝,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伸眶,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年刽宪,在試婚紗的時候發(fā)現(xiàn)自己被綠了厘贼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡圣拄,死狀恐怖嘴秸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情庇谆,我是刑警寧澤岳掐,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站饭耳,受9級特大地震影響串述,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜哥攘,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一剖煌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧逝淹,春花似錦耕姊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至欣簇,卻和暖如春规脸,著一層夾襖步出監(jiān)牢的瞬間坯约,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工莫鸭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留闹丐,地道東北人。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓被因,卻偏偏與公主長得像卿拴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子梨与,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359