1. 程式人生 > >hive整合spark和mysql

hive整合spark和mysql

一、Hive安裝

1.Hive簡介

​ Hive是Facebook開發的構建於Hadoop叢集之上的資料倉庫應用,可以將結構化的資料檔案對映為一張資料庫表,並提供完整的SQL查詢功能,可以將SQL語句轉換為MapReduce任務進行執行。

​ Hive是一個可以提供有效的、合理的且直觀的組織和使用資料的模型,即使對於經驗豐富的Java開發工程師來說,將這些常見的資料運算對應到底層的MapReduce Java API也是令人敬畏的。Hive可以幫使用者做這些工作,使用者就可以集中精力關注查詢本身了。Hive可以將大多數的查詢轉換為MapReduce任務。Hive最適合於資料倉庫應用程式,使用該應用程式進行相關的靜態資料分析,不需要快速響應給出結果,而且資料本身也不會頻繁變化。

​ Hive不是一個完整的資料庫。Hadoop以及HDFS的設計本身約束和侷限性限制了Hive所能勝任的工作。最大的限制就是Hive不支援記錄級別的更新、插入或者刪除。使用者可以通過查詢生成新表或將查詢結果匯入到檔案中去。因為,Hadoop是一個面向批處理的系統,而MapReduce啟動任務啟動過程需要消耗很長時間,所以Hive延時也比較長。Hive還不支援事務。因此,Hive不支援聯機事務處理(OLTP),更接近於一個聯機分析技術(OLAP)工具,但是,目前還沒有滿足“聯機”部分。

​ Hive提供了一系列的工具,可以用來進行資料提取轉化載入(ETL),其中,ETL是一種可以儲存、查詢和分析儲存在Hadoop中的大規模資料的機制。因此,Hive是最適合資料倉庫應用程式的,它可以維護海量資料,而且可以對資料進行挖掘,然後形成意見和報告等。

​ 因為大多數的資料倉庫應用程式是基於SQL的關係資料庫現實的,所以,Hive降低了將這些應用程式移植到Hadoop上的障礙。如果使用者懂得SQL,那麼學習使用Hive會很容易。因為Hive定義了簡單的類SQL 查詢語言——HiveQL,這裡值得一提的是,與SQLServer、Oracle相比,HiveQL和MySQL提供的SQL語言更接近。同樣的,相對於其他的Hadoop語言和工具來說,Hive也使得開發者將基於SQL的應用程式移植到Hadoop變得更加容易。

2.Hive安裝

​ 接下來,開始Hive的安裝,安裝Hive之前,首先需要裝好Hadoop和Spark。在可下載最新版本Hive,並且能夠查閱版本改動說明,本次課程採用1.2.2版本進行安裝。可以採用WinSCP傳輸apache-hive-1.2.2-bin.tar至虛擬機器“下載”資料夾中,再進行後續安裝。

cd ~/下載                                              # 進入下載資料夾
sudo tar -zxf apache-hive-1.2.2-bin.tar.gz -C /usr/local    # 安裝至/usr/local資料夾內
cd /usr/local                                         # 進入/usr/local資料夾
sudo mv ./apache-hive-1.2.2-bin/ ./hive               # 更名為hive
sudo chown -R hadoop ./hive                           # 修改hive許可權
mkdir -p /usr/local/hive/warehouse                    # 建立元資料儲存資料夾
sudo chmod a+rwx /usr/local/hive/warehouse            # 修改檔案許可權  

然後新增Hive安裝路徑至系統環境變數

vim ~/.profile

新增下述路徑

#Hive
export HIVE_HOME=/usr/local/hive
export PATH=$PATH:$HIVE_HOME/bin

並使之生效

source ~/.profile

修改hive讀取spark的jar包地址

cd /usr/local/hive/bin
vim hive

修改為

# add Spark assembly jar to the classpath
if [[ -n "$SPARK_HOME" ]]
then
  sparkAssemblyPath=`ls ${SPARK_HOME}/jars/*.jar`
  CLASSPATH="${CLASSPATH}:${sparkAssemblyPath}"
fi

然後採用hive預設配置

cd /usr/local/hive/conf
cp hive-default.xml.template hive-default.xml

嘗試啟動Hive,此時啟動是以本地模式進行啟動,能正常啟動則說明安裝成功。

start-all.sh
hive

​ 若出現jline等jar包錯誤,則需要進入到hadoop安裝目錄下的share/hadoop/yarn/lib下刪除jline-0.9.94.jar檔案,再啟動hive即可(因為高版本的Hadoop對Hive有捆綁)。

cd /usr/local/hadoop/share/hadoop/yarn/lib
rm -rf jline-0.9.94.jar 

3. Hive的基本配置

​ 在安裝Hive時,預設情況下,元資料儲存在Derby資料庫中。Derby是一個完全用Java編寫的資料庫,所以可以跨平臺,但需要在JVM中執行 。因為多使用者和系統可能需要併發訪問元資料儲存,所以預設的內建資料庫並不適用於生產環境。任何一個適用於JDBC進行連線的資料庫都可用作元資料庫儲存,這裡我們把MySQL作為儲存元資料的資料庫。接下來,我們分別對這兩種方式進行介紹,即使用Derby資料庫的方式和使用MySQL資料庫的方式。

3.1 使用Derby作為元資料庫

​ 本地模式中,使用者的“表”等元資料資訊,都預設儲存在file://user/hive/warehouse,對於其他模式預設儲存路徑是hdfs://namenode_server/user/hive/warehouse。使用如下命令編輯hive-site.xml檔案:

vim /usr/local/hive/conf/hive-site.xml  

在hive-site.xml檔案新增以下內容:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/usr/local/hive/warehouse</value>   
    <description>location of default database for the warehouse</description>
  </property>
<property>
    <name>javax.jdo.option.ConnectionURL</name>
     <value>jdbc:derby:;databaseName=/usr/local/hive/metastore_db;create=true</value>                           
    <description>JDBC connect string for a JDBC metastore</description>
  </property>
</configuration>

​ 若要以偽分散式模式和分散式模式配置Hive,只需根據Hadoop配置檔案core-site.xml中fs.defaultFS的值對hive.metastore.warehouse.dir 進行相應修改即可。配置完成之後即可啟動Hive,然後嘗試使用HiveQL命令建立表。

hive
show databases;
create database if not exists derby;
use derby;
create table x(a int);
select * from x;
drop table x;
exit;

3.2 使用MySQL作為元資料庫

3.2.1 安裝MySQL

首先,檢視並解除安裝系統自帶的MySQL相關安裝包(或之前安裝過MySQL),命令如下:

sudo apt install rpm
rpm -qa | grep mysql

若沒有安裝rpm工具,系統會有提示,按照提示安裝即可。接下來檢視是否有系統自帶的MySQL相關安裝包,若有,按下面命令刪除:

sudo rpm -e --nodeps mysql-libs-xxxxxx       

注:xxxxx是已經安裝的mysql的版本號,然後進行MySQL的安裝

sudo apt-get install mysql-server        

安裝完成後,啟動設定MySQL服務

sudo service mysql start
mysql -u root -p

當然,還可使用下列命令進行額外設定

sudo chkconfig mysql on                              # 設定開機自動啟動
sudo /usr/bin/mysqladmin -u root password '123'      # 設定root使用者密碼

接下來,建立hive使用者及其資料庫等,用於存放Hive的元資料

sudo vi /etc/mysql/my.cnf
註釋掉:bind-address            = 127.0.0.1

create database hive;
grant all on *.* to hive[email protected] identified by 'hive'; 
flush privileges;
exit;

切換hive使用者登陸

mysql -u hive -p hive
show databases;

若能看到hive資料庫存在,則說明建立成功。

3.2.2 修改Hive配置

接下來,修改hive-site.xml檔案

vim /usr/local/hive/conf/hive-site.xml  

輸入下列資訊

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true</value>
    <description>JDBC connect string for a JDBC metastore</description>
  </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>hive</value>
    <description>username to use against metastore database</description>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>hive</value>
    <description>password to use against metastore database</description>
  </property>
</configuration>

或者指定元資料資料夾

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/usr/local/hive/warehouse</value>   
    <description>location of default database for the warehouse</description>
  </property>
<property>
    <name>javax.jdo.option.ConnectionURL</name>
   <value>jdbc:mysql://localhost:3306/hive;createDatebaseIfNotExist=true</value>                           
    <description>JDBC connect string for a JDBC metastore</description>
  </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.ConnectionPassword </name> 
   <value>hive</value> 
</property> 
 <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>hive</value>
    <description>Username to use against metastore database</description>
   </property>
</configuration>

然後將JDBC檔案放到hive的lib資料夾內,JDBC包的下載參考前述部分

cd ~/下載
cp mysql-connector-java-5.1.26-bin.jar /usr/local/hive/lib
mkdir -p /usr/local/hive/tmp
sudo chmod a+rwx /usr/local/hive/tmp

也可從官網直接下載最新版jdbc

wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.45.tar.gz

然後進行解壓安裝。當然,如果之前刪除了jline-0.9.94.jar,此時需要把hive對應的jar包放進去

cp /usr/local/hive/lib/jline-2.12.jar  /usr/local/hadoop/share/hadoop/yarn/lib

然後嘗試啟動hive

schematool -dbType mysql -initSchema
start-all.sh
hive

成啟動後,即可輸入hive –help檢視hive常用命令。

二、Hive使用

1.Hive基本資料型別

首先,我們簡單敘述一下HiveQL的基本資料型別。

Hive支援基本資料型別和複雜型別, 基本資料型別主要有數值型別(INT、FLOAT、DOUBLE ) 、布林型和字串, 複雜型別有三種:ARRAY、MAP 和 STRUCT。

1.1 基本資料型別

  • TINYINT: 1個位元組
  • SMALLINT: 2個位元組
  • INT: 4個位元組
  • BIGINT: 8個位元組
  • BOOLEAN: TRUE/FALSE
  • FLOAT: 4個位元組,單精度浮點型
  • DOUBLE: 8個位元組,雙精度浮點型STRING 字串

1. 2 複雜資料型別

  • ARRAY: 有序欄位
  • MAP: 無序欄位
  • STRUCT: 一組命名的欄位

2.常用的HiveQL操作命令

​ Hive常用的HiveQL操作命令主要包括:資料定義、資料操作。接下來詳細介紹一下這些命令即用法(想要了解更多請參照《Hive程式設計指南》一書)。

2.1 資料定義

主要用於建立修改和刪除資料庫、表、檢視、函式和索引。

  • 建立、修改和刪除資料庫

    create database if not exists hive;       #建立資料庫
    show databases;                           #檢視Hive中包含資料庫
    show databases like 'h.*';                #檢視Hive中以h開頭資料庫
    describe databases;                       #檢視hive資料庫位置等資訊
    alter database hive set dbproperties;     #為hive設定鍵值對屬性
    use hive;                                 #切換到hive資料庫下
    drop database if exists hive;             #刪除不含表的資料庫
    drop database if exists hive cascade;     #刪除資料庫和它中的表

    注意,除 dbproperties屬性外,資料庫的元資料資訊都是不可更改的,包括資料庫名和資料庫所在的目錄位置,沒有辦法刪除或重置資料庫屬性。

  • 建立、修改和刪除表

    
    #建立內部表(管理表)
    
    create table if not exists hive.usr(
        name string comment 'username',
        pwd string comment 'password',
        address struct<street:string,city:string,state:string,zip:int>,
        comment  'home address',
        identify map<int,tinyint> comment 'number,sex') 
        comment 'description of the table'  
       tblproperties('creator'='me','time'='2016.1.1'); 
    
    #建立外部表
    
    create external table if not exists usr2(
        name string,
        pwd string,
    address struct<street:string,city:string,state:string,zip:int>,
        identify map<int,tinyint>) 
        row format delimited fields terminated by ','
       location '/usr/local/hive/warehouse/hive.db/usr'; 
    
    #建立分割槽表
    
    create table if not exists usr3(
        name string,
        pwd string,
        address struct<street:string,city:string,state:string,zip:int>,
        identify map<int,tinyint>) 
        partitioned by(city string,state string);    
    
    #複製usr表的表模式  
    
    create table if not exists hive.usr1 like hive.usr;
    show tables in hive;  
    show tables 'u.*';        #檢視hive中以u開頭的表
    describe hive.usr;        #檢視usr表相關資訊
    alter table usr rename to custom;      #重命名錶 
    
    #為表增加一個分割槽
    
    alter table usr2 add if not exists 
       partition(city=”beijing”,state=”China”) 
       location '/usr/local/hive/warehouse/usr2/China/beijing'; 
    
    #修改分割槽路徑
    
    alter table usr2 partition(city=”beijing”,state=”China”)
       set location '/usr/local/hive/warehouse/usr2/CH/beijing';
    
    #刪除分割槽
    
    alter table usr2 drop if exists  partition(city=”beijing”,state=”China”)
    
    #修改列資訊
    
    alter table usr change column pwd password string after address;
    alter table usr add columns(hobby string);                  #增加列
    alter table usr replace columns(uname string);              #刪除替換列
    alter table usr set tblproperties('creator'='liming');      #修改表屬性
    alter table usr2 partition(city=”beijing”,state=”China”)    #修改儲存屬性
    set fileformat sequencefile;             
    use hive;                                                   #切換到hive資料庫下
    drop table if exists usr1;                                  #刪除表
    drop database if exists hive cascade;                       #刪除資料庫和它中的表
  • 檢視和索引的建立、修改和刪除

    基本語法格式

    create view view_name as....;                #建立檢視
    alter view view_name set tblproperties(…);   #修改檢視

    因為檢視是隻讀的,所以 對於檢視只允許改變元資料中的 tblproperties屬性。

    
    #刪除檢視
    
    drop view if exists view_name;
    
    #建立索引
    
    create index index_name on table table_name(partition_name/column_name)  
    as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' with deferred rebuild....; 

    這裡’org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler’是一個索引處理器,即一個實現了索引介面的Java類,另外Hive還有其他的索引實現。

    alter index index_name on table table_name partition(...)  rebulid;   #重建索引

    如果使用 deferred rebuild,那麼新索引成空白狀態,任何時候可以進行第一次索引建立或重建。

    show formatted index on table_name;                       #顯示索引
    drop index if exists index_name on table table_name;      #刪除索引

2.2 資料操作

主要實現的是將資料裝載到表中(或是從表中匯出),並進行相應查詢操作

  • 向表中裝載資料

    create table if not exists hive.stu(id int,name string) 
    row format delimited fields terminated by '\t';
    create table if not exists hive.course(cid int,sid int) 
    row format delimited fields terminated by '\t';

    向表中裝載資料有兩種方法:從檔案中匯入和通過查詢語句插入。

    • 從檔案中匯入

    假如這個表中的記錄儲存於檔案stu.txt中,該檔案的儲存路徑為usr/local/hadoop/examples/stu.txt,內容如下。

    1 Hello
    2 World
    3 CDA
    load data local inpath '/usr/local/hadoop/examples/stu.txt' overwrite into table stu;
    • 通過查詢語句插入

    使用如下命令,建立stu1表,它和stu表屬性相同,我們要把從stu表中查詢得到的資料插入到stu1中:

    create table stu1 as select id,name from stu;

    上面是建立表,並直接向新表插入資料;若表已經存在,向表中插入資料需執行以下命令:

    insert overwrite table stu1 select id,name from stu where(條件);

    這裡關鍵字overwrite的作用是替換掉表(或分割槽)中原有資料,換成into關鍵字,直接追加到原有內容後。

  • 寫入臨時檔案

    insert overwrite local directory '/usr/local/hadoop/tmp/stu'  select id,name from stu;
  • 查詢操作

    select id,name,
    case 
    when id=1 then 'first' 
    when id=2 then 'second'
    else 'third'

2.3 連線

​ 連線(join)是將兩個表中在共同資料項上相互匹配的那些行合併起來, HiveQL 的連線分為內連線、左向外連線、右向外連線、全外連線和半連線 5 種。

  • 內連線(等值連線)

    內連線使用比較運算子根據每個表共有的列的值匹配兩個表中的行。

    首先,我們先把以下內容插入到course表中(自行完成)。

1 3
2 1
3 1

​ 下面, 查詢stu和course表中學號相同的所有行,命令如下:

select stu.*, course.* from stu join course on(stu .id=course .sid);
  • 左連線

    ​ 左連線的結果集包括“LEFT OUTER”子句中指定的左表的所有行, 而不僅僅是連線列所匹配的行。如果左表的某行在右表中沒有匹配行, 則在相關聯的結果集中右表的所有選擇列均為空值,命令如下:

select stu.*, course.* from stu left outer join course on(stu .id=course .sid); 
  • 右連線

    ​ 右連線是左向外連線的反向連線,將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將為左表返回空值。命令如下:

select stu.*, course.* from stu right outer join course on(stu .id=course .sid); 
  • 全連線

    ​ 全連線返回左表和右表中的所有行。當某行在另一表中沒有匹配行時,則另一個表的選擇列表包含空值。如果表之間有匹配行,則整個結果集包含基表的資料值。命令如下:

select stu.*, course.* from stu full outer join course on(stu .id=course .sid); 
  • 半連線

    ​ 半連線是 Hive 所特有的, Hive 不支援 in 操作,但是擁有替代的方案; left semi join, 稱為半連線, 需要注意的是連線的表不能在查詢的列中,只能出現在 on 子句中。命令如下:

select stu.* from stu left semi join course on(stu .id=course .sid); 

三、Spark與Hive整合

1.安裝Spark

​ 為了讓Spark能夠訪問Hive,必須為Spark新增Hive支援。Spark官方提供的預編譯版本,通常是不包含Hive支援的,需要採用原始碼編譯,編譯得到一個包含Hive支援的Spark版本。首先測試一下電腦上已經安裝的Spark版本是否支援Hive

spark-shell

這樣就啟動進入了spark-shell,然後輸入:

import org.apache.spark.sql.hive.HiveContext    

如果報錯,則說明spark無法識別org.apache.spark.sql.hive.HiveContext,這時我們就需要採用原始碼編譯方法得到支援hive的spark版本。

  • 下載原始碼檔案

    ​ 進入官網後,可以按照下圖配置選擇“2.1.0(Dec 28, 2016)”和“SourceCode”,然後,在圖中紅色方框內,有個“Download Spark: spark-2.1.0.tgz”的下載連結,點選該連結就可以下載Spark原始碼檔案了。

  • 編譯過程

    cd /home/hadoop/spark-2.0.2
    ./dev/make-distribution.sh —tgz —name h27hive -Pyarn -Phadoop-2.7 -Dhadoop.version=2.7.1 -Phive -Phive-thriftserver -DskipTests

    或可選擇直接安裝已編譯好的版本,把下好的spark-2.0.2-bin-h27hive.tgz放到下載資料夾內

  • Spark解壓安裝

    cd ~/下載                                              # 進入下載資料夾
    sudo tar -zxf spark-2.0.2-bin-h27hive.tgz -C /usr/local   # 安裝至/usr/local資料夾內
    cd /usr/local                                         # 進入/usr/local資料夾
    sudo mv ./spark-1.4.0-bin-hadoop2.4/ ./spark          # 更名為spark
    sudo chown -R hadoop ./spark                          # 修改sqoop許可權
  • 新增環境變數

    注,如果電腦上已經裝了另一個spark,此處可不增設環境變數

    vim ~/.profile

    新增spark安裝路徑

    
    #spark
    
    export SPARK_HOME=/usr/local/spark
    export PATH=$PATH:$SPARK_HOME/bin

    並儲存修改

    source ~/.profile
  • 修改Spark配置

    cd /usr/local/spark/conf                              # 進入spark配置資料夾
    sudo cp spark-env.sh.template spark-env.sh            # 複製spark-env臨時檔案為配置檔案
    vim spark-env.sh                                      # 編輯spark配置檔案

    新增下述配置資訊

    export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath)

    有了上面的配置資訊以後,Spark就可以把資料儲存到Hadoop分散式檔案系統HDFS中,也可以從HDFS中讀取資料。如果沒有配置上面資訊,Spark就只能讀寫本地資料,無法讀寫HDFS資料。在偽分散式模式下僅測試是否安裝成功時,其他配置暫時可不做修改。

  • 執行樣例程式

    cd /usr/local/spark
    bin/run-example SparkPi 2>&1 | grep "Pi is"
  • 放置Hive配置檔案

    為了讓Spark能夠訪問Hive,需要把Hive的配置檔案hive-site.xml拷貝到Spark的conf目錄下

    cd /usr/local/spark/conf
    cp /usr/local/hive/conf/hive-site.xml .
    ll
  • 測試是否整合成功

    spark-shell

    然後輸入

    import org.apache.spark.sql.hive.HiveContext

2.在Hive中建立資料庫和表

首先啟動MySQL資料庫:

service mysql start  

​ 由於Hive是基於Hadoop的資料倉庫,使用HiveQL語言撰寫的查詢語句,最終都會被Hive自動解析成MapReduce任務由Hadoop去具體執行,因此,需要啟動Hadoop,然後再啟動Hive。
然後執行以下命令啟動Hadoop:

start-all.sh

Hadoop啟動成功以後,可以再啟動Hive:

hive  

然後在hive命令提示符內進行操作

create database if not exists sparktest;
show databases;
 create table if not exists sparktest.student(
> id int,
> name string,
> gender string,
> age int);
use sparktest;
show tables;
insert into student values(1,'Xueqian','F',23);
insert into student values(2,'Weiliang','M',24);
select * from student;

通過上面操作,我們就在Hive中建立了sparktest.student表,這個表有兩條資料。

3.連線Hive讀寫資料

​ 現在我們看如何使用Spark讀寫Hive中的資料。注意,操作到這裡之前,你一定已經按照前面的各個操作步驟,啟動了Hadoop、Hive、MySQL和spark-shell(包含Hive支援)。在進行程式設計之前,我們需要做一些準備工作,我們需要修改“/usr/local/sparkwithhive/conf/spark-env.sh”這個配置檔案:

cd /usr/local/spark/conf/
vim spark-env.sh

這樣就使用vim編輯器打開了spark-env.sh這個檔案,輸入下面內容:

export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath)
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export CLASSPATH=$CLASSPATH:/usr/local/hive/lib
export SCALA_HOME=/usr/local/scala
export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop
export HIVE_CONF_DIR=/usr/local/hive/conf
export SPARK_CLASSPATH=$SPARK_CLASSPATH:/usr/local/hive/lib/mysql-connector-java-5.1.26-bin.jar

儲存並推出,然後啟動spark-shell

spark-shell

然後在shell介面中輸入

import org.apache.spark.sql.Row
import org.apache.spark.sql.SparkSession
case class Record(key: Int, value: String)
val warehouseLocation = "spark-warehouse"
val spark = SparkSession.builder().appName("Spark Hive Example").config("spark.sql.warehouse.dir", warehouseLocation).enableHiveSupport().getOrCreate()
import spark.implicits._
import spark.sql
sql("SELECT * FROM sparktest.student").show()

然後再開一個命令列介面,啟動hive介面,檢視spark-shell中對hive表插入資料的結果

hive

然後輸入

use sparktest;
select * from student;

然後在spark-shell中進行資料插入

import java.util.Properties
import org.apache.spark.sql.types._
import org.apache.spark.sql.Row
//下面我們設定兩條資料表示兩個學生資訊
val studentRDD = spark.sparkContext.parallelize(Array("3 Rongcheng M 26","4 Guanhua M 27")).map(_.split(" "))
//下面要設定模式資訊
val schema = StructType(List(StructField("id", IntegerType, true),StructField("name", StringType, true),StructField("gender", StringType, true),StructField("age", IntegerType, true)))
//下面建立Row物件,每個Row物件都是rowRDD中的一行
val rowRDD = studentRDD.map(p => Row(p(0).toInt, p(1).trim, p(2).trim, p(3).toInt))
//建立起Row物件和模式之間的對應關係,也就是把資料和模式對應起來
val studentDF = spark.createDataFrame(rowRDD, schema)
//檢視studentDF
studentDF.show()
//下面註冊臨時表
studentDF.registerTempTable("tempTable")
sql("insert into sparktest.student select * from tempTable")

然後切換到hive視窗,檢視資料庫內容變化

select * from student;

能夠查詢到新增資料結果,則說明操作成功。