hive入門

=====hive入門=====

1. 概念

  • Apache Hive™數據倉庫軟件有助於使用SQL讀取,寫入和管理駐留在分佈式存儲中的大型數據集。能夠將結構投影到已存儲的數據上。提供了一個命令行工具和JDBC驅動程序來將用戶鏈接到Hive
  • 主要面向查詢操做,通常不進行刪除和更新操做,由於hive處理的數據通常都是歷史數據
  • hive容許開發者自定義mapreduce處理複雜的分析工做
  • hive是SQL解析引擎,它將SQL轉換成M/R 程序,而後在hadoop執行
  • hive的表和數據其實就是hdfs的目錄和文件
  • hdfs日誌文件(數據源)-- mapreduce將結構投影到已存儲數據上(解析引擎) -- 命令行工具和JDBC使用SQL(數據統計)
  • 數據倉庫:數據倉庫是一個面向主題的,集成的,不可更新的,隨時間不變化的數據集合,它用於支持企業或者組織的決策分析處理
  • hive和hbase區別java

    • Hive適合用來對一段時間內的數據進行分析查詢or統計查詢,例如,用來計算趨勢或者網站的日誌。Hive不該該用來進行實時的查詢。由於它須要很長時間才能夠返回結果
    • Hbase是一種在Hadoop之上的NoSQL 的Key/vale數據庫。HBase能夠用來進行實時查詢,
    • 數據也能夠從Hive寫到Hbase,設置再從Hbase寫回Hive。

2. hive的體系結構

  1. hive的元數據mysql

    • hive將元數據存儲在數據庫(metastore)中,支持mysql,derby,oracle數據庫,默認使用內置derby數據庫(只支持單連接)
    • hive中的元數據包括表的名字,表的列和分區及其屬性,表的屬性(是否外部表),表的數據所在的目錄等
  2. hadoopweb

    • 用hdfs進行存儲,利用mapreduce進行計算

3. hive的安裝

  1. 環境要求:sql

    • jdk並配置環境變量
    • mysql安裝並啓動用來作元數據存儲(內嵌的derby數據庫只支持單連接)
    • hadoop安裝並啓動(支持單機環境,僞分佈模式,集羣模式)
  2. 下載wget安裝包.tar.gz並解壓tar -zxvf xxx.tar.gz -C /home
  3. 將mysql驅動配置到hive的classpath目錄下,上傳放到$HIVE_HOME/lib目錄便可,要注意驅動和mysql版本對應
  4. 修改配置文件$HIVE_HOME/conf數據庫

    <!-- hive-env.sh配置文件 -->apache

    HADOOP_HOME=/home/hadoop-standalone/hadoop-2.9.0
        export HIVE_CONF_DIR=/home/apache-hive-2.3.2-bin/conf

    <!-- hive-site.xml配置文件 -->數組

    <configuration>
            <property>
                <name>javax.jdo.option.ConnectionURL</name> 
                <value>jdbc:mysql://172.18.113.120:3306/hive?createDatabaseIfNotExist=true</value> 
            </property> 
            <property> 
                <name>javax.jdo.option.ConnectionDriverName</name>
                <value>com.mysql.jdbc.Driver</value>
            </property>
            <property>
                <name>javax.jdo.option.ConnectionUserName</name>
                <value>root</value>
            </property>
            <property>
                <name>javax.jdo.option.ConnectionPassword</name>
                <value>123456</value>
            </property>
            <property>
                    <name>hive.server2.webui.host</name>
                    <value>master</value>
            </property>
            <property>
                    <name>hive.server2.webui.port</name>
                    <value>10002</value>
            </property>
        </configuration>
  5. 格式化hdfs存儲目錄oracle

    $ $HADOOP_HOME/bin/hadoop fs -mkdir       /tmp
    $ $HADOOP_HOME/bin/hadoop fs -mkdir       /user/hive/warehouse
    $ $HADOOP_HOME/bin/hadoop fs -chmod g+w   /tmp
    $ $HADOOP_HOME/bin/hadoop fs -chmod g+w   /user/hive/warehouse
  6. init元數據存儲倉庫分佈式

    $ $HIVE_HOME/bin/schematool -dbType <db type> -initSchema

4. hive之CLI命令行方式

  1. 兩種啓動方式:函數

    1.)直接輸出$HIVE_HOME/bin/hive執行程序
    2.)$HIVE_HOME/bin/hive --service cli
    
    (-S 進入靜默模式 -e '命令'不進入交互模式,直接執行命令)
  2. 經常使用的CLI命令(每一個命令必須已分號結尾做爲命令結束符,--開頭是註釋)

    • 退出命令行 quit
    • 查看數據庫 show databases
    • 查看錶   show tables
    • 查看錶結構 desc 表名
    • 查看內置函數 show functions
    • 查看hdfs上文件 dfs -ls 目錄
    • 執行操做系統的命令 !命令
    • 執行sql語句    select 語句
    • 執行sql腳本文件  source sql文件
  3. hive遠程服務啓動方式

    • 端口號10000
    • 啓動方式:hive --service hiveserver2 &
    • jdbc或者odbc遠程登陸數據倉庫對數據進行操做,必須啓動遠程服務以供鏈接

5. hive數據類型

hive數據類型有一下5種

* 數字類型
* 時間類型
* 字符串類型
* 其餘類型
* 複雜類型
  1. 數字類型

    • TINGINT(1字節有符號整數,從-128至127)
    • SMALLINT(2字節有符號整數,從-32,768至32,767)
    • INT/ INTEGER(4字節有符號整數,從-2,147,483,648到2,147,483,647)
    • BIGINT(8字節符號整數,從-9,223,372,036,854,775,808至9,223,372,036,854,775,807)
    • FLOAT(4字節單精度浮點數)
    • DOUBLE(8字節雙精度浮點數)
    • DECIMAL (能夠自定義精度和範圍)
    • NUMERIC
  2. 日期/時間類型

    • TIMESTAMP(注意:只能從Hive 0.8.0開始)
    • DATE(注意:只能從Hive 0.12.0開始)
    • INTERVAL(注意:只能從Hive 1.2.0開始)
  3. 字符串類型

    • STRING
    • VARCHAR
    • CHAR
  4. 其餘類型

    • BOOLEAN
    • BINARY
  5. 複雜類型

    1. ARRAYS<data_type>       數組類型,由一系列相同數據類型元素組成
    2. MAPS<primitive_type,data_type>   集合類型,包看key-value鍵值對,能夠經過key來訪問元素
    3. STRUCT<col_name : data_type [COMMENT col_comment], ...> 結構類型,能夠包含不一樣數據類型元素,經過點語法獲取元素
    4. union: UNIONTYPE<data_type, data_type, ...> (Note: Only available starting with Hive 0.7.0.)
  6. 建立表,使用數據類型
建立一張表,包含基本數據類型

        create table t_user
            (u_id int,
            u_name string,
            married boolean,
            salary double,
            birthday date
            ); -- 這裏不能建立user表,換個表名t_user

        建立一張表,包含數組類型

        create table student (sid int,sname string,project array<string>); 

        -- {1,"tom",["語文","數學","英語"]}

        建立一張表,包含map數據類型

        create table stu2(id int,name string,project map<string,float>);

        -- {1,"tom",<'大學語文',65>}


        建立一張表,用array<map<string,float>>

        create table stu3(id int,name string,grades array<map<string,float>>);

        -- {1,'tom',[<'語文',85>,<'數學',85>]


        建立一張表,包含struct數據類型

            create table stu4(id int,info struct <name:string,age:int,sec:string>);

            --{1,{'tom',10,'男'}}

6. hive的數據存儲

  • 基於hdfs
  • 沒有專門的數據存儲格式
  • 存儲結構主要包括:數據庫,文件,表,視圖
  • 能夠直接加載文本文件(.txt文件等)
  • 建立表時,指定hive數據的列分隔符和行分隔符
  • 表分類:內部表,分區表,外部表,桶表 + 視圖
  1. 內部表

    • 概念:

      • 與數據庫中的table在概念上是相似的
      • 每個table在hive中都有一個相應的目錄存儲數據,默認在/usr/hive/warehouse目錄下,能夠指定任何其餘目錄
      • 全部的table不包括外部表,都保存在這個目錄中
    • 建立表例子

      • create table t1(id int,name string,age int); -- 默認在/usr/hive/warehouse目錄下
      • create table t1(id int,name string,age int) location '/mytable/hive/t2'; -- 指定數據在hdfs上的存儲位置
      • create table t1(id int,name string,age int) row format delimited fields terminated by ','; -- 指明列分隔符,默認列與列之間沒有任何分隔符
      • create table t1 as select * from t2 row format delimited fields terminated by ','; -- 從一個表中的數據建立表並導入數據
      • alter table t1 add columns(english int); -- 添加列
  2. 分區表(partition)

    • 概念

      • partition對應於數據庫的partition列的密集索引(例如按照性別男女分紅兩個區)
      • 在hive中,表的一個partition對應與標下的一個目錄,全部的partition的數據都存儲在對應的目錄中
    • 案例

      • create table t1(id int,name string) partitioned by (gender string) row format delimited fields terminated by ','; -- 按照gender列分區
      • insert into table t1 partition(gender='nan') select id,name from t2 where gender='nan';
  3. 外部表

    • 概念

      • 指向已近在hdfs中存在的數據,能夠建立partition
      • 它和內部表在元數據的組織上是相同的,而實際數據的存儲則有較大的差別
      • 外部表只有一個過程,加載數據和建立表同事完成,並不會移動到數據倉庫目錄中,只是與外部數據創建一個連接,當刪除一個外部表時,僅刪除改連接
    • 例子

      • create external table t1 (id int,name string) row format delimited fields termicated by ',' location '/input'; //對hdfs中已近存在的目錄和文件建立一個連接
相關文章
相關標籤/搜索