1. 程式人生 > >第69課:Spark SQL通過Hive資料來源實戰

第69課:Spark SQL通過Hive資料來源實戰

內容:

    1.Spark SQL操作Hive解析
    2.SparkSQL操作Hive實戰

一、Spark SQL操作Hive解析

    1.在目前企業級大資料Spark開發的時候,絕大多數是採用Hive作為資料倉庫的spark提供Hive的支援功能,Spark通過HiveContex可以操作Hive中的資料,基於HiveContext可以使用sql/hsql兩種方式編寫SQL語句對Hive進行操作,包括建立表、從刪除表、往表裡匯入資料構造各種SQL語法構造各種sql語句對錶中的資料進行操作;
    2.也可以直接通過saveAsTable的方式把DataFrame中的資料儲存到Hive資料倉庫中
    3.可以直接通過HiveContext.table方法直接載入Hive中的表來生成dataframe

二、SparkSQL操作Hive實戰

資料score.txt

Michael	98
Andy	95
Justin	91

資料people.txt 

Michael	29
Andy	30
Justin	19

程式碼示例

import org.apache.spark.sql.SparkSession
import org.apache.spark.{SparkConf, SparkContext}


/**
  * FileName: SparkSQLToHive
  * Author:   hadoop
  * Email:    [email protected]
* Date: 18-11-9 下午12:25 * Description: */ object SparkSQLToHive { def main(args: Array[String]): Unit = { //建立SparkConf用於讀取系統資訊並設定運用程式的名稱 val conf = new SparkConf().setMaster("local").setAppName("SparkSQLToHive") //建立JavaSparkContext物件例項作為整個Driver的核心基石 val sc = new SparkContext(conf) //設定輸出log的等級,可以設定INFO,WARN,ERROR sc.setLogLevel("INFO") //建立SQLContext上下文物件,用於SqL的分析 val hiveContext = SparkSession .builder() .enableHiveSupport() .appName("SparkSQLToHive") .config("spark.some.config.option", "some-value") .getOrCreate() /** * 在目前企業級大資料Spark開發的時候,絕大多數是採用Hive作為資料倉庫的spark提供Hive的支援功能,Spark通過HiveContex可以操作Hive中的資料 * 基於HiveContext可以使用sql/hsql兩種方式編寫SQL語句對Hive進行操作, * 包括建立表、從刪除表、往表裡匯入資料構造各種SQL語法構造各種sql語句對錶中的資料進行操作; * 二、也可以直接通過saveAsTable的方式把DataFrame中的資料儲存到Hive資料倉庫中 * 三、可以直接通過HiveContext.table方法直接載入Hive中的表來生成dataframe */ hiveContext.sql("use hive") //使用Hive資料倉庫中的hive資料庫 hiveContext.sql("drop table if exists people") //刪除同名的table hiveContext.sql("create table if not exists people (name String,age Int)") //建立自定義的table hiveContext.sql("load data local inpath '/home/hadoop/people/people.txt' into table people") //匯入本地資料到Hive資料倉庫中,背後實際上發生了資料的拷貝,當然也可以通過load data input去獲得HDFS等上面的資料到Hive(此時發生資料的移動) hiveContext.sql("drop table if exists score") hiveContext.sql("create table if not exists score (name String,score Int)") hiveContext.sql("load data local inpath '/home/hadoop/people/people.txt' into table score") // 通過HiveContext使用join直接基於Hive中的兩張表進行操作獲得成績大於90分的人的name,age,score val resultDS = hiveContext.sql("select people.name,people.age,score.score from people join score on people.name = score.name") /** * 通過registerTempTable建立一張Hive Manager Table ,資料的元資料和資料即將具體的資料位置都是由Hive資料倉庫進行管理,當刪除的時候,資料也會一起被刪除(磁碟上的資料也被刪除) */ hiveContext.sql("drop table if exists peopleinfor") resultDS.registerTempTable("peopleinfor") //* 使用HiveContext的table方法可以直接去讀取Hive資料倉庫中的table並生成DataFrame,接下來可以進行機器學習、圖計算、各種複雜etl等操作 val dataFromHive = hiveContext.table("peopleinfor") dataFromHive.show() } }