Hbase二級索引_Hive on Hbase 及phoenix詳解

Hbase二級索引_Hive on Hbase 及phoenix詳解

知識點02:課程目標

  1. SQL on Hbase
    • 使用SQL語句來操做Hbase
      • Hbase不支持SQL接口
    • 額外的工具來實現
  2. Hive on Hbase【瞭解】
    • 使用Hive中的SQL語句來實現對Hbase數據的操做
    • 本質:經過MapReduce來實現讀寫Hbase
  3. Phoenix【重點】
    • 專門爲Hbase所設計的一個工具
    • 本質:直接封裝Hbase的JavaAPI來實現的
    • 功能、應用場景、基本原理、特色
    • 基本使用:語法【upsert、delete、select】

知識點03:SQL on Hbase

  • 問題html

    • Hbase是列存儲NoSQL,不支持SQL,開發接口不方便大部分用戶使用,怎麼辦?
  • 分析java

    • 應用場景:應用系統或者大數據存儲系統node

      • 大數據存儲系統:大數據工程師sql

        • 利用Hbase來存儲大量要分析處理的數據
        • 使用JavaAPI經過MapReduce或者經過Spark來實現數據的讀寫
          • Java
          • Scala
      • 應用系統:Java工程師、數據分析師shell

        • 利用Hbase來存儲大量的商品數據、訂單數據,來提供高性能的查詢
      • 問題:Java人員不會Hbase Java API,對於數據庫會JDBC數據庫

      • 解決:須要一個工具能讓Hbase支持SQL,支持JDBC方式對Hbase進行處理apache

    • Hbase的結構是否能實現基於SQL的查詢操做?vim

      • 普通表數據:按行操做markdown

        id		name		age		sex		addr
        001		zhangsan	18		null	shanghai
        002		lisi		20		female	null
        003		wangwu		null	male	beijing
        ……
      • Hbase數據:按列操做app

        rowkey			cf1:id		cf1:name		cf1:age		cf2:sex		cf2:addr
        zhangsan_001	001			zhangsan		18			null		shanghai
        lisi_002		002			lisi			20			female		null
        wangwu_003		003			wangwu			null		male		beijing
        ……
    • 能夠基於Hbase數據構建結構化的數據形式

    • 能夠用SQL來實現處理

  • 實現

    • 將Hbase表中每一行對應的全部列構建一張完整的結構化表
    • 若是這一行沒有這一列,就補null
    • Hive:經過MapReduce來實現
    • Phoenix:經過Hbase API封裝實現的
  • 總結

    • 緣由:知足各類應用場景下,對於Hbase使用的方式,基於SQL方式會更加通用
    • 實現:將整張表的數據構建結構化形式,每一行沒有列就補null
    • 原理:將SQL轉換成了Hbase的客戶端操做來實現的

知識點04:Hive on Hbase 介紹

  • 功能:實現Hive與Hbase集成,使用Hive SQL對Hbase的數據進行處理

  • 原理

    • Hive的功能:使用HQL對錶的數據進行處理

      • 本質:經過MapReduce對HDFS中的文件進行處理

      • 原理

        • TextInputFormat:讀文件

        • TextOutputFormat:寫文件

    • MapReduce的功能:讀取數據進行分佈式計算

      • InputFormat:輸入類

        • TextInputFormat:默認的輸入類,用於讀取文件系統
        • DBInputFormat:用於讀取JDBC數據庫
          • 實現Sqoop導入的:將MySQL數據導入到Hive或者HDFS
        • TableInputFormat:用於讀取Hbase數據
      • OutputFormat:輸出類

        • TextOutputFormat:默認的輸出類,用於將結果寫入文件系統

        • DBOutputFormat:用於寫入JDBC數據庫

          • 實現Sqoop導出的:將HDFS數據寫入MySQL
        • TableOutputFormat:用於寫入HBase數據庫

    • 原理:Hive能夠經過MapReduce來實現映射讀寫Hbase表的數據

  • 特色

    • 優勢:支持完善的SQL語句,能夠實現各類複雜SQL的數據處理及計算,經過分佈式計算程序實現,對大數據量的數據處理比較友好

    • 缺點:不支持二級索引,數據量不是特別大的狀況下,性能通常

  • 應用

    • 基於大數據高性能的離線讀寫,而且使用SQL來開發

知識點05:Hive on Hbase 配置

  • 需求

    • 配置Hive與Hbase集成,實現Hive中能夠讀寫Hbase表
  • 分析

    • step1:修改Hive配置文件,指定Hbase的Zookeeper地址
    • step2:按順序啓動HDFS、ZK、Hbase、Hive
  • 實現

    • 所有操做在第三臺機器

    • 修改hive-site.xml:Hive經過SQL訪問Hbase,就是Hbase的客戶端,就要鏈接zookeeper

      cd /export/server/hive-2.1.0-bin/
      vim conf/hive-site.xml
      <property>
      	<name>hive.zookeeper.quorum</name>
      	<value>node1,node2,node3</value>
      </property>
       <property>
      	<name>hbase.zookeeper.quorum</name>
      	<value>node1,node2,node3</value>
      </property>
      <property>
          <name>hive.server2.enable.doAs</name>
          <value>false</value>
      </property>
    • 修改hive-env.sh

      export HBASE_HOME=/export/server/hbase-2.1.0
    • 啓動HDFS、ZK、Hbase:第一臺機器

      start-dfs.sh
      /export/server/zookeeper-3.4.6/bin/start-zk-all.sh
      start-hbase.sh
    • 啓動Hive和YARN:第三臺機器

      #啓動YARN
      start-yarn.sh
      #先啓動metastore服務
      start-metastore.sh 
      #而後啓動hiveserver
      start-hiveserver2.sh
      #而後啓動beeline
      start-beeline.sh
  • 總結

    • 先配置Hive的配置文件:添加Hbase的地址
    • 而後按照前後順序啓動便可

知識點06:Hive on Hbase 實現

  • 需求

    • 在Hive中實現對Hbase表的數據讀寫
  • 分析

    • step1:若是表在Hbase中沒有,Hive中沒有,在Hive中建立表,指定在Hbase中建立關聯表
      • 場景比較少
      • 在Hive中建一張表,自動在Hbase中也建立一張對應的表
    • step2:若是表在Hbase中有,可是Hive中沒有,Hive中建立一張外部表,關聯Hbase表
      • 主要應用的方式
      • Hbase中的表已經存在,已經有數據,構建一張Hive關聯表,使用SQL進行查詢
  • 實現

    • 第三臺機器測試

    • 若是Hbase中表不存在:【用的比較少】

      • 建立測試數據文件

        vim /export/data/hive-hbase.txt
        1,zhangsan,80
        2,lisi,60
        3,wangwu,30
        4,zhaoliu,70
      • 建立測試表

        --建立測試數據庫
        create database course;
        --切換數據庫
        use course;
        --建立原始數據表
        create external table if not exists course.score(
        id int,
        cname string,
        score int
        ) row format delimited fields terminated by ',' stored as textfile ;
        --加載數據文件
        load data local inpath '/export/data/hive-hbase.txt' into table score;
      • 建立一張Hive與HBASE的映射表

        create table course.hbase_score(
        id int,
        cname string,
        score int
        )  
        stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'  
        with serdeproperties("hbase.columns.mapping" = "cf:name,cf:score") 
        tblproperties("hbase.table.name" = "hbase_score");
      • 將測試表的數據寫入映射表

        set hive.exec.mode.local.auto=true;
         insert overwrite table course.hbase_score select id,cname,score from course.score;
    • 若是Hbase中表已存在,只能建立外部表

      create external table course.t1(
        key string,
        name string,
        age  string,
        addr string,
        phone string
        )  
        stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'  
        with serdeproperties("hbase.columns.mapping" = ":key,basic:name,basic:age,other:addr,other:phone") 
        tblproperties("hbase.table.name" = "itcast:t1");

      [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-gNcVCpdb-1616545523608)(20210323_分佈式NoSQL列存儲數據庫Hbase(六).assets/image-20210323160741636.png)]

  • 總結

    • Hive中的只是關聯表,並無數據,數據存儲在Hbase表中
  • 在Hive中建立Hbase的關聯表,關聯成功後,使用SQL處理關聯表

    • 若是Hbase中表不存在,默認使用Hive的第一列做爲rowkey
    • 若是Hbase中表已存在,只能建外部表,使用:key來表示rowkey
    • HIve中與Hbase關聯的表,不能使用load加載,只能使用insert,經過MR讀寫數據

知識點07:二級索引問題

  • 問題

    • Hbase使用Rowkey做爲惟一索引,須要構建二級索引來解決查詢問題,如何構建二級索引以及維護索引表?
  • 分析

    • step1:基於存儲和經常使用查詢需求,構建數據表

    • step2:基於其餘查詢需求,構建索引表

    • step3:先查詢索引表,再查詢數據表

    • step4:自動維護索引表與原始數據表的數據一致性

  • 實現

    • 構建數據表

      rowkey:name_id			id			name			age			sex			addr
      zhangsan_001			001			zhangsan		18			male		shanghai
      lisi_002				002			lisi			18			female		beijing
      zhangsan_003			003			zhangsan		20			male		
      ……
    • 構建索引表

      rowkey:id_name			col:原始數據表的rowkey
      001_zhangsan			zhangsan_001
      002_lisi				lisi_002
      003_zhangsan			zhangsan_003
      ……
    • 查詢:根據id查詢

      • 先查詢索引表,獲取原表的Rowkey
      • 再根據原表Rowkey查詢原表的數據
    • 維護

      • 當原表數據須要進行增刪改時,索引表自動進行同步增刪改對應的數據,保持一致性
    • 解決方案

      • 方案一:客戶端操做實現

        put1
        put2
        table1.put(put1)
        table2.put(put2)
      • 方案二:協處理器實現

        • 本身開發代碼
        • 讓Hbase監聽原表,原表更改一條,Hbase自動對索引表更改一條
        • 缺點:開發比較麻煩
      • 方案三:第三方工具

        • Phoenix:將全部協處理器都封裝好了

          • 支持SQL

          • 支持自動二級索引的構建及維護

            create index
  • 總結

    • 需求:必須根據不一樣的查詢條件,建立不一樣的索引表,而且維護全部索引表與原始數據表的同步
    • 解決:經過Phoenix自帶的協處理器來實現

知識點08:Phoenix的介紹

  • 功能

    • 專門基於Hbase所設計的SQL on Hbase 工具

    • 使用Phoenix實現基於SQL操做Hbase

    • 使用Phoenix自動構建二級索引並維護二級索引

  • 原理

    • 上層提供了SQL接口

      • 底層所有經過Hbase Java API來實現,經過構建一系列的Scan和Put來實現數據的讀寫
    • 功能很是豐富

      • 底層封裝了大量的內置的協處理器,能夠實現各類複雜的處理需求,例如二級索引等
  • 特色

    • 優勢
      • 支持SQL接口
      • 支持自動維護二級索引
    • 缺點
      • SQL支持的語法不全面
      • Bug比較多
    • Hive on Hbase對比
      • Hive:SQL更加全面,可是不支持二級索引,底層經過分佈式計算工具來實現
      • Phoenix:SQL相對支持不全面,可是性能比較好,直接使用HbaseAPI,支持索引實現
  • 應用

    • Phoenix適用於任何須要使用SQL或者JDBC來快速的讀寫Hbase的場景

    • 或者須要構建及維護二級索引場景

知識點09:Phoenix的安裝配置

  • 需求

    • http://phoenix.apache.org/
    • 安裝部署配置Phoenix,集成Hbase
  • 分析

    • step1:上傳解壓安裝
    • step2:修改配置,指定Hbase鏈接地址
    • step3:啓動Phoenix,鏈接Hbase
  • 實現

    • 下載:http://phoenix.apache.org/download.html

    • 第一臺機器上傳

      cd /export/software/
      rz
    • 第一臺機器解壓

      tar -zxvf apache-phoenix-5.0.0-HBase-2.0-bin.tar.gz -C /export/server/
      cd /export/server/
      mv apache-phoenix-5.0.0-HBase-2.0-bin phoenix-5.0.0-HBase-2.0-bin
    • 修改三臺Linux文件句柄數

      vim /etc/security/limits.conf
      #在文件的末尾添加如下內容,*號不能去掉
      
      * soft nofile 65536
      * hard nofile 131072
      * soft nproc 2048
      * hard nproc 4096
    • 將Phoenix全部jar包分發到Hbase的lib目錄下

      #拷貝到第一臺機器
      cd /export/server/phoenix-5.0.0-HBase-2.0-bin/
      cp phoenix-* /export/server/hbase-2.1.0/lib/
      cd /export/server/hbase-2.1.0/lib/
      #分發給第二臺和第三臺
      scp phoenix-* node2:$PWD
      scp phoenix-* node3:$PWD
    • 修改hbase-site.xml,添加一下屬性

      cd /export/server/hbase-2.1.0/conf/
      vim hbase-site.xml
      <!-- 關閉流檢查,從2.x開始使用async -->
      <property>
          <name>hbase.unsafe.stream.capability.enforce</name>
          <value>false</value>
        </property>
      <!-- 支持HBase命名空間映射 -->
      <property>
          <name>phoenix.schema.isNamespaceMappingEnabled</name>
          <value>true</value>
      </property>
      <!-- 支持索引預寫日誌編碼 -->
      <property>
        <name>hbase.regionserver.wal.codec</name>
        <value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
      </property>
      <!-- 配置NS映射 -->
      <property>
        <name>phoenix.schema.isNamespaceMappingEnabled</name>
        <value>true</value>
      </property>
    • 同步給其餘兩臺機器

      scp hbase-site.xml node2:$PWD
      scp hbase-site.xml node3:$PWD
    • 同步給Phoenix

      cp hbase-site.xml /export/server/phoenix-5.0.0-HBase-2.0-bin/bin/
    • 重啓Hbase

      stop-hbase.sh
      start-hbase.sh
    • 啓動Phoenix

      cd /export/server/phoenix-5.0.0-HBase-2.0-bin/
      bin/sqlline.py node1:2181
    • 測試

      !tables

      [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-KuMfWPJo-1616545523612)(20210323_分佈式NoSQL列存儲數據庫Hbase(六).assets/image-20210323170434725.png)]

      [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-nqVKRbLI-1616545523613)(20210323_分佈式NoSQL列存儲數據庫Hbase(六).assets/image-20210323170543556.png)]

  • 總結

    • 解壓安裝
    • 修改配置
    • 啓動服務
    • 測試環境

知識點10:Phoenix的語法:DDL:NS

  • http://phoenix.apache.org/language/index.html

  • 需求

    • 實現基於SQL的數據庫管理:建立、切換、刪除
  • 分析

    • step1:建立Namespace
    • step2:切換Namespace
    • step3:刪除Namespace
  • 實現

    • 建立NS

      create schema if not exists student;
    • 切換NS

      use student;
    • 刪除NS

      drop schema if exists student;
  • 總結

    • 基本與SQL語法一致
    • 注意:Phoenix中默認會將全部字符轉換爲大寫,若是想要使用小寫字母,必須加上雙引號

知識點11:Phoenix的語法:DDL:Table

  • 需求

    • 實現基於SQL的數據表管理:建立、列舉、查看、刪除
  • 分析

    • step1:列舉當前全部的表
    • step2:建立表
    • step3:查詢表信息
    • step4:刪除表
  • 實現

    • 列舉

      !tables
    • 建立

      • 語法:http://phoenix.apache.org/language/index.html#create_table

        CREATE TABLE my_schema.my_table (
            id BIGINT not null primary key, 
            date Date
        );
        
        CREATE TABLE my_table ( 
            id INTEGER not null primary key desc, 
            m.date DATE not null,
            m.db_utilization DECIMAL, 
            i.db_utilization
        ) m.VERSIONS='3';
        
        CREATE TABLE stats.prod_metrics ( 
              host char(50) not null, 
              created_date date not null,
              txn_count bigint 
              CONSTRAINT pk PRIMARY KEY (host, created_date) 
          );
        
          CREATE TABLE IF NOT EXISTS "my_case_sensitive_table"( 
              "id" char(10) not null primary key, 
              "value" integer
          ) DATA_BLOCK_ENCODING='NONE',VERSIONS=5,MAX_FILESIZE=2000000 
          split on (?, ?, ?);
        
        
          CREATE TABLE IF NOT EXISTS my_schema.my_table (
              org_id CHAR(15), 
              entity_id CHAR(15), 
              payload binary(1000),
              CONSTRAINT pk PRIMARY KEY (org_id, entity_id) 
          ) TTL=86400

  • 若是Hbase中沒有這個表

    use default;
    create table if not exists ORDER_DTL(
        ID varchar primary key,
        C1.STATUS varchar,
        C1.PAY_MONEY float,
        C1.PAYWAY integer,
        C1.USER_ID varchar,
        C1.OPERATION_DATE varchar,
        C1.CATEGORY varchar
    );
  • 若是Hbase中已存在會自動關聯

    create table if not exists ORDER_INFO(
        "ROW" varchar primary key,
        "C1"."USER_ID" varchar,
        "C1"."OPERATION_DATE" varchar,
        "C1"."PAYWAY" varchar,
        "C1"."PAY_MONEY" varchar,
        "C1"."STATUS" varchar,
        "C1"."CATEGORY" varchar
    ) column_encoded_bytes=0 ;
    • 查看

      !desc order_info;
    • 刪除

      drop table if exists order_dtl;
  • 總結

    • 建立表時,必須指定主鍵做爲Rowkey,主鍵列不能加列族

       

    create table if not exists ORDER_INFO(
    –不能這麼寫
    「C1」.「ROW」 varchar primary key,
    「C1」.「USER_ID」 varchar,
    「C1」.「OPERATION_DATE」 varchar,
    「C1」.「PAYWAY」 varchar,
    「C1」.「PAY_MONEY」 varchar,
    「C1」.「STATUS」 varchar,
    「C1」.「CATEGORY」 varchar
    ) column_encoded_bytes=0 ;

    - Phoenix 4.8版本以前只要建立同名的Hbase表,會自動關聯數據
    
    - Phoenix 4.8版本之後,不推薦關聯表的方式
    
      - 推薦使用視圖關聯的方式來實現,若是你要使用關聯表的方式,必須加上如下參數
    
        ```
        column_encoded_bytes=0 ;
        ```
    
    - 若是關聯已存在的表,Rowkey字段叫作ROW,使用時必須加上雙引號

    select 「ROW」,「C1」.USER_ID,「C1」.「PAYWAY」 from ORDER_INFO;

     

知識點12:Phoenix的語法:DML:upsert

列名 數值 描述
Rowkey 02602f66-adc7-40d4-8485-76b5632b5b53 行健,編碼生成
USER_ID 4944191 用戶id
OPERATION_DATE 2020-04-25 12:09:16 操做時間
PAYWAY 1 支付方式
PAY_MONEY 4070 支付金額
STATUS 已提交 提交狀態
CATEGORY 手機; 分類
  • 需求

    • 基於order_info訂單數據實現DML插入數據
  • 分析

    • Phoenix中插入更新的命令爲:upsert

      • 功能:insert + update
        • MySQL:replace
        • 若是存在就更新,若是不存在就插入
    • 語法及示例

      UPSERT INTO TEST VALUES('foo','bar',3);
      UPSERT INTO TEST(NAME,ID) VALUES('foo',123);
      UPSERT INTO TEST(ID, COUNTER) VALUES(123, 0) ON DUPLICATE KEY UPDATE COUNTER = COUNTER + 1;
      UPSERT INTO TEST(ID, MY_COL) VALUES(123, 0) ON DUPLICATE KEY IGNORE;
  • 實現

    • 插入一條數據

      upsert into order_info values('z8f3ca6f-2f5c-44fd-9755-1792de183845','4944191','2020-04-25 12:09:16','1','4070','未提交','電腦');
    • 更新USERID爲123456

      upsert into order_info("ROW","USER_ID") values('z8f3ca6f-2f5c-44fd-9755-1792de183845','123456');
  • 總結

    • 語法相似於insert語法

    • 功能:insert + update

知識點13:Phoenix的語法:DML:delete

  • 需求

    • 基於order_info訂單數據實現DML刪除數據
  • 分析

    • Phoenix中插入更新的命令爲:delete

    • 語法及示例

      DELETE FROM TEST;
      DELETE FROM TEST WHERE ID=123;
      DELETE FROM TEST WHERE NAME LIKE 'foo%';
  • 實現

    • 刪除USER_ID爲123456的rowkey數據

      delete from order_info where USER_ID = '123456';
  • 總結

    • 與MySQL是一致的

知識點14:Phoenix的語法:DQL:select

  • 需求

    • 基於order_info訂單數據實現DQL查詢數據
  • 分析

    • Phoenix中插入更新的命令爲:select

    • 語法及示例

      SELECT * FROM TEST LIMIT 1000;
      SELECT * FROM TEST LIMIT 1000 OFFSET 100;
      SELECT full_name FROM SALES_PERSON WHERE ranking >= 5.0
          UNION ALL SELECT reviewer_name FROM CUSTOMER_REVIEW WHERE score >= 8.0
  • 實現

    • 查詢支付方式爲1的數據

      select "ROW",payway,pay_money,category from order_info where payway = '1';
    • 查詢每種支付方式對應的用戶人數,而且按照用戶人數降序排序

      • 分組:每、各個、不一樣
      • 排序:用戶人數
      select
        payway,
        count(distinct user_id) as numb
      from order_info
      group by payway 
      order by numb desc;
    • 查詢數據的第60行到66行

      --之前的寫法:limit M,N
      --M:開始位置
      --N:顯示的條數
      --Phoenix的寫法:limit N offset M
      select * from order_info limit 6 offset 60;//總共66行,顯示最後6行
    • 函數支持

      • http://phoenix.apache.org/language/functions.html
  • 總結

    • 基本查詢與MySQL也是一致的
    • 寫的時候注意數據類型以及大小寫的問題便可
    • 若是遇到SQL報錯,檢查語法是否支持

知識點15:Phoenix的使用:預分區

  • 需求

    • Hbase命令建表

      create Ns;tbname,列族,預分區
    • 建立表的時候,須要根據Rowkey來設計多個分區

  • 分析

    • Phoenix也提供了建立表時,指定分區範圍的語法

      CREATE TABLE IF NOT EXISTS "my_case_sensitive_table"( 
          "id" char(10) not null primary key, 
          "value" integer
      )
      DATA_BLOCK_ENCODING='NONE',VERSIONS=5,MAX_FILESIZE=2000000 split on (?, ?, ?)
  • 實現

    • 建立數據表,四個分區

      drop table if exists ORDER_DTL;
      create table if not exists ORDER_DTL(
          "id" varchar primary key,
          C1."status" varchar,
          C1."money" float,
          C1."pay_way" integer,
          C1."user_id" varchar,
          C1."operation_time" varchar,
          C1."category" varchar
      ) 
      CONPRESSION='GZ'
      SPLIT ON ('3','5','7');
    • 插入數據

      UPSERT INTO "ORDER_DTL" VALUES('02602f66-adc7-40d4-8485-76b5632b5b53','已提交',4070,1,'4944191','2020-04-25 12:09:16','手機;');
      UPSERT INTO "ORDER_DTL" VALUES('0968a418-f2bc-49b4-b9a9-2157cf214cfd','已完成',4350,1,'1625615','2020-04-25 12:09:37','家用電器;;電腦;');
      UPSERT INTO "ORDER_DTL" VALUES('0e01edba-5e55-425e-837a-7efb91c56630','已提交',6370,3,'3919700','2020-04-25 12:09:39','男裝;男鞋;');
      UPSERT INTO "ORDER_DTL" VALUES('0f46d542-34cb-4ef4-b7fe-6dcfa5f14751','已付款',9380,1,'2993700','2020-04-25 12:09:46','維修;手機;');
      UPSERT INTO "ORDER_DTL" VALUES('1fb7c50f-9e26-4aa8-a140-a03d0de78729','已完成',6400,2,'5037058','2020-04-25 12:10:13','數碼;女裝;');
      UPSERT INTO "ORDER_DTL" VALUES('23275016-996b-420c-8edc-3e3b41de1aee','已付款',280,1,'3018827','2020-04-25 12:09:53','男鞋;汽車;');
      UPSERT INTO "ORDER_DTL" VALUES('2375a7cf-c206-4ac0-8de4-863e7ffae27b','已完成',5600,1,'6489579','2020-04-25 12:08:55','食品;家用電器;');
      UPSERT INTO "ORDER_DTL" VALUES('269fe10c-740b-4fdb-ad25-7939094073de','已提交',8340,2,'2948003','2020-04-25 12:09:26','男裝;男鞋;');
      UPSERT INTO "ORDER_DTL" VALUES('2849fa34-6513-44d6-8f66-97bccb3a31a1','已提交',7060,2,'2092774','2020-04-25 12:09:38','酒店;旅遊;');
      UPSERT INTO "ORDER_DTL" VALUES('28b7e793-6d14-455b-91b3-0bd8b23b610c','已提交',640,3,'7152356','2020-04-25 12:09:49','維修;手機;');
      UPSERT INTO "ORDER_DTL" VALUES('2909b28a-5085-4f1d-b01e-a34fbaf6ce37','已提交',9390,3,'8237476','2020-04-25 12:10:08','男鞋;汽車;');
      UPSERT INTO "ORDER_DTL" VALUES('2a01dfe5-f5dc-4140-b31b-a6ee27a6e51e','已提交',7490,2,'7813118','2020-04-25 12:09:05','機票;文娛;');
      UPSERT INTO "ORDER_DTL" VALUES('2b86ab90-3180-4940-b624-c936a1e7568d','已付款',5360,2,'5301038','2020-04-25 12:08:50','維修;手機;');
      UPSERT INTO "ORDER_DTL" VALUES('2e19fbe8-7970-4d62-8e8f-d364afc2dd41','已付款',6490,0,'3141181','2020-04-25 12:09:22','食品;家用電器;');
      UPSERT INTO "ORDER_DTL" VALUES('2fc28d36-dca0-49e8-bad0-42d0602bdb40','已付款',3820,1,'9054826','2020-04-25 12:10:04','家用電器;;電腦;');
      UPSERT INTO "ORDER_DTL" VALUES('31477850-8b15-4f1b-9ec3-939f7dc47241','已提交',4650,2,'5837271','2020-04-25 12:08:52','機票;文娛;');
      UPSERT INTO "ORDER_DTL" VALUES('39319322-2d80-41e7-a862-8b8858e63316','已提交',5000,1,'5686435','2020-04-25 12:08:51','家用電器;;電腦;');
      UPSERT INTO "ORDER_DTL" VALUES('3d2254bd-c25a-404f-8e42-2faa4929a629','已完成',5000,1,'1274270','2020-04-25 12:08:43','男裝;男鞋;');
      UPSERT INTO "ORDER_DTL" VALUES('42f7fe21-55a3-416f-9535-baa222cc0098','已完成',3600,2,'2661641','2020-04-25 12:09:58','維修;手機;');
      UPSERT INTO "ORDER_DTL" VALUES('44231dbb-9e58-4f1a-8c83-be1aa814be83','已提交',3950,1,'3855371','2020-04-25 12:08:39','數碼;女裝;');
      UPSERT INTO "ORDER_DTL" VALUES('526e33d2-a095-4e19-b759-0017b13666ca','已完成',3280,0,'5553283','2020-04-25 12:09:01','食品;家用電器;');
      UPSERT INTO "ORDER_DTL" VALUES('5a6932f4-b4a4-4a1a-b082-2475d13f9240','已提交',50,2,'1764961','2020-04-25 12:10:07','家用電器;;電腦;');
      UPSERT INTO "ORDER_DTL" VALUES('5fc0093c-59a3-417b-a9ff-104b9789b530','已提交',6310,2,'1292805','2020-04-25 12:09:36','男裝;男鞋;');
      UPSERT INTO "ORDER_DTL" VALUES('605c6dd8-123b-4088-a047-e9f377fcd866','已完成',8980,2,'6202324','2020-04-25 12:09:54','機票;文娛;');
      UPSERT INTO "ORDER_DTL" VALUES('613cfd50-55c7-44d2-bb67-995f72c488ea','已完成',6830,3,'6977236','2020-04-25 12:10:06','酒店;旅遊;');
      UPSERT INTO "ORDER_DTL" VALUES('62246ac1-3dcb-4f2c-8943-800c9216c29f','已提交',8610,1,'5264116','2020-04-25 12:09:14','維修;手機;');
      UPSERT INTO "ORDER_DTL" VALUES('625c7fef-de87-428a-b581-a63c71059b14','已提交',5970,0,'8051757','2020-04-25 12:09:07','男鞋;汽車;');
      UPSERT INTO "ORDER_DTL" VALUES('6d43c490-58ab-4e23-b399-dda862e06481','已提交',4570,0,'5514248','2020-04-25 12:09:34','酒店;旅遊;');
      UPSERT INTO "ORDER_DTL" VALUES('70fa0ae0-6c02-4cfa-91a9-6ad929fe6b1b','已付款',4100,1,'8598963','2020-04-25 12:09:08','維修;手機;');
      UPSERT INTO "ORDER_DTL" VALUES('7170ce71-1fc0-4b6e-a339-67f525536dcd','已完成',9740,1,'4816392','2020-04-25 12:09:51','數碼;女裝;');
      UPSERT INTO "ORDER_DTL" VALUES('71961b06-290b-457d-bbe0-86acb013b0e3','已完成',6550,3,'2393699','2020-04-25 12:08:49','男鞋;汽車;');
      UPSERT INTO "ORDER_DTL" VALUES('72dc148e-ce64-432d-b99f-61c389cb82cd','已提交',4090,1,'2536942','2020-04-25 12:10:12','機票;文娛;');
      UPSERT INTO "ORDER_DTL" VALUES('7c0c1668-b783-413f-afc4-678a5a6d1033','已完成',3850,3,'6803936','2020-04-25 12:09:20','酒店;旅遊;');
      UPSERT INTO "ORDER_DTL" VALUES('7fa02f7a-10df-4247-9935-94c8b7d4dbc0','已提交',1060,0,'6119810','2020-04-25 12:09:21','維修;手機;');
      UPSERT INTO "ORDER_DTL" VALUES('820c5e83-f2e0-42d4-b5f0-83802c75addc','已付款',9270,2,'5818454','2020-04-25 12:10:09','數碼;女裝;');
      UPSERT INTO "ORDER_DTL" VALUES('83ed55ec-a439-44e0-8fe0-acb7703fb691','已完成',8380,2,'6804703','2020-04-25 12:09:52','男鞋;汽車;');
      UPSERT INTO "ORDER_DTL" VALUES('85287268-f139-4d59-8087-23fa6454de9d','已取消',9750,1,'4382852','2020-04-25 12:10:00','數碼;女裝;');
      UPSERT INTO "ORDER_DTL" VALUES('8d32669e-327a-4802-89f4-2e91303aee59','已提交',9390,1,'4182962','2020-04-25 12:09:57','機票;文娛;');
      UPSERT INTO "ORDER_DTL" VALUES('8dadc2e4-63f1-490f-9182-793be64fed76','已付款',9350,1,'5937549','2020-04-25 12:09:02','酒店;旅遊;');
      UPSERT INTO "ORDER_DTL" VALUES('94ad8ee0-8898-442c-8cb1-083a4b609616','已提交',4370,0,'4666456','2020-04-25 12:09:13','維修;手機;');
      UPSERT INTO "ORDER_DTL" VALUES('994cbb44-f0ee-45ff-a4f4-76c87bc2b972','已付款',3190,3,'3200759','2020-04-25 12:09:25','數碼;女裝;');
      UPSERT INTO "ORDER_DTL" VALUES('9ff3032c-8679-4247-9e6f-4caf2dc93aff','已提交',850,0,'8835231','2020-04-25 12:09:40','男鞋;汽車;');
      UPSERT INTO "ORDER_DTL" VALUES('9ff3032c-8679-4247-9e6f-4caf2dc93aff','已付款',850,0,'8835231','2020-04-25 12:09:45','食品;家用電器;');
      UPSERT INTO "ORDER_DTL" VALUES('a467ba42-f91e-48a0-865e-1703aaa45e0e','已提交',8040,0,'8206022','2020-04-25 12:09:50','家用電器;;電腦;');
      UPSERT INTO "ORDER_DTL" VALUES('a5302f47-96d9-41b4-a14c-c7a508f59282','已付款',8570,2,'5319315','2020-04-25 12:08:44','機票;文娛;');
      UPSERT INTO "ORDER_DTL" VALUES('a5b57bec-6235-45f4-bd7e-6deb5cd1e008','已提交',5700,3,'6486444','2020-04-25 12:09:27','酒店;旅遊;');
      UPSERT INTO "ORDER_DTL" VALUES('ae5c3363-cf8f-48a9-9676-701a7b0a7ca5','已付款',7460,1,'2379296','2020-04-25 12:09:23','維修;手機;');
      UPSERT INTO "ORDER_DTL" VALUES('b1fb2399-7cf2-4af5-960a-a4d77f4803b8','已提交',2690,3,'6686018','2020-04-25 12:09:55','數碼;女裝;');
      UPSERT INTO "ORDER_DTL" VALUES('b21c7dbd-dabd-4610-94b9-d7039866a8eb','已提交',6310,2,'1552851','2020-04-25 12:09:15','男鞋;汽車;');
      UPSERT INTO "ORDER_DTL" VALUES('b4bfd4b7-51f5-480e-9e23-8b1579e36248','已提交',4000,1,'3260372','2020-04-25 12:09:35','機票;文娛;');
      UPSERT INTO "ORDER_DTL" VALUES('b63983cc-2b59-4992-84c6-9810526d0282','已提交',7370,3,'3107867','2020-04-25 12:08:45','數碼;女裝;');
      UPSERT INTO "ORDER_DTL" VALUES('bf60b752-1ccc-43bf-9bc3-b2aeccacc0ed','已提交',720,2,'5034117','2020-04-25 12:09:03','機票;文娛;');
      UPSERT INTO "ORDER_DTL" VALUES('c808addc-8b8b-4d89-99b1-db2ed52e61b4','已提交',3630,1,'6435854','2020-04-25 12:09:10','酒店;旅遊;');
      UPSERT INTO "ORDER_DTL" VALUES('cc9dbd20-cf9f-4097-ae8b-4e73db1e4ba1','已付款',5000,0,'2007322','2020-04-25 12:08:38','維修;手機;');
      UPSERT INTO "ORDER_DTL" VALUES('ccceaf57-a5ab-44df-834a-e7b32c63efc1','已提交',2660,2,'7928516','2020-04-25 12:09:42','數碼;女裝;');
      UPSERT INTO "ORDER_DTL" VALUES('d7be5c39-e07c-40e8-bf09-4922fbc6335c','已付款',8750,2,'1250995','2020-04-25 12:09:09','食品;家用電器;');
      UPSERT INTO "ORDER_DTL" VALUES('dfe16df7-4a46-4b6f-9c6d-083ec215218e','已完成',410,0,'1923817','2020-04-25 12:09:56','家用電器;;電腦;');
      UPSERT INTO "ORDER_DTL" VALUES('e1241ad4-c9c1-4c17-93b9-ef2c26e7f2b2','已付款',6760,0,'2457464','2020-04-25 12:08:54','數碼;女裝;');
      UPSERT INTO "ORDER_DTL" VALUES('e180a9f2-9f80-4b6d-99c8-452d6c037fc7','已完成',8120,2,'7645270','2020-04-25 12:09:32','男鞋;汽車;');
      UPSERT INTO "ORDER_DTL" VALUES('e4418843-9ac0-47a7-bfd8-d61c4d296933','已付款',8170,2,'7695668','2020-04-25 12:09:11','家用電器;;電腦;');
      UPSERT INTO "ORDER_DTL" VALUES('e8b3bb37-1019-4492-93c7-305177271a71','已完成',2560,2,'4405460','2020-04-25 12:10:05','男裝;男鞋;');
      UPSERT INTO "ORDER_DTL" VALUES('eb1a1a22-953a-42f1-b594-f5dfc8fb6262','已完成',2370,2,'8233485','2020-04-25 12:09:24','機票;文娛;');
      UPSERT INTO "ORDER_DTL" VALUES('ecfd18f5-45f2-4dcd-9c47-f2ad9b216bd0','已付款',8070,3,'6387107','2020-04-25 12:09:04','酒店;旅遊;');
      UPSERT INTO "ORDER_DTL" VALUES('f1226752-7be3-4702-a496-3ddba56f66ec','已付款',4410,3,'1981968','2020-04-25 12:10:10','維修;手機;');
      UPSERT INTO "ORDER_DTL" VALUES('f642b16b-eade-4169-9eeb-4d5f294ec594','已提交',4010,1,'6463215','2020-04-25 12:09:29','男鞋;汽車;');
      UPSERT INTO "ORDER_DTL" VALUES('f8f3ca6f-2f5c-44fd-9755-1792de183845','已付款',5950,3,'4060214','2020-04-25 12:09:12','機票;文娛;');
    • 查看分區請求

      [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-9PGuMMNL-1616545523616)(20210323_分佈式NoSQL列存儲數據庫Hbase(六).assets/image-20210323175607500.png)]

  • 總結

    • 實現效果與命令實現的效果一致

    • 經過SQL建表語句實現

      create table() split

知識點16:Phoenix的使用:加鹽salt

  • 需求

    • Rowkey設計的時候爲了不連續,構建Rowkey的散列,若是rowkey設計是連續的,怎麼解決?
  • 分析

    • 在Phoenix建立一張鹽表,寫入的數據會自動進行編碼寫入不一樣的分區中

      CREATE TABLE table (
          a_key VARCHAR PRIMARY KEY, 
          a_col VARCHAR
      ) SALT_BUCKETS = 20;
  • 實現

    • 建立一張鹽表,指定分區個數爲10

      drop table if exists ORDER_DTL;
      create table if not exists ORDER_DTL(
          "id" varchar primary key,
          C1."status" varchar,
          C1."money" float,
          C1."pay_way" integer,
          C1."user_id" varchar,
          C1."operation_time" varchar,
          C1."category" varchar
      ) 
      CONPRESSION='GZ', SALT_BUCKETS=10;

      [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-DWu5bCTo-1616545523618)(20210323_分佈式NoSQL列存儲數據庫Hbase(六).assets/image-20210323180045755.png)]

    • 寫入數據

      UPSERT INTO "ORDER_DTL" VALUES('02602f66-adc7-40d4-8485-76b5632b5b53','已提交',4070,1,'4944191','2020-04-25 12:09:16','手機;');
      UPSERT INTO "ORDER_DTL" VALUES('0968a418-f2bc-49b4-b9a9-2157cf214cfd','已完成',4350,1,'1625615','2020-04-25 12:09:37','家用電器;;電腦;');
      UPSERT INTO "ORDER_DTL" VALUES('0e01edba-5e55-425e-837a-7efb91c56630','已提交',6370,3,'3919700','2020-04-25 12:09:39','男裝;男鞋;');
      UPSERT INTO "ORDER_DTL" VALUES('0f46d542-34cb-4ef4-b7fe-6dcfa5f14751','已付款',9380,1,'2993700','2020-04-25 12:09:46','維修;手機;');
      UPSERT INTO "ORDER_DTL" VALUES('1fb7c50f-9e26-4aa8-a140-a03d0de78729','已完成',6400,2,'5037058','2020-04-25 12:10:13','數碼;女裝;');
      UPSERT INTO "ORDER_DTL" VALUES('23275016-996b-420c-8edc-3e3b41de1aee','已付款',280,1,'3018827','2020-04-25 12:09:53','男鞋;汽車;');
      UPSERT INTO "ORDER_DTL" VALUES('2375a7cf-c206-4ac0-8de4-863e7ffae27b','已完成',5600,1,'6489579','2020-04-25 12:08:55','食品;家用電器;');
      UPSERT INTO "ORDER_DTL" VALUES('269fe10c-740b-4fdb-ad25-7939094073de','已提交',8340,2,'2948003','2020-04-25 12:09:26','男裝;男鞋;');
      UPSERT INTO "ORDER_DTL" VALUES('2849fa34-6513-44d6-8f66-97bccb3a31a1','已提交',7060,2,'2092774','2020-04-25 12:09:38','酒店;旅遊;');
      UPSERT INTO "ORDER_DTL" VALUES('28b7e793-6d14-455b-91b3-0bd8b23b610c','已提交',640,3,'7152356','2020-04-25 12:09:49','維修;手機;');
      UPSERT INTO "ORDER_DTL" VALUES('2909b28a-5085-4f1d-b01e-a34fbaf6ce37','已提交',9390,3,'8237476','2020-04-25 12:10:08','男鞋;汽車;');
      UPSERT INTO "ORDER_DTL" VALUES('2a01dfe5-f5dc-4140-b31b-a6ee27a6e51e','已提交',7490,2,'7813118','2020-04-25 12:09:05','機票;文娛;');
      UPSERT INTO "ORDER_DTL" VALUES('2b86ab90-3180-4940-b624-c936a1e7568d','已付款',5360,2,'5301038','2020-04-25 12:08:50','維修;手機;');
      UPSERT INTO "ORDER_DTL" VALUES('2e19fbe8-7970-4d62-8e8f-d364afc2dd41','已付款',6490,0,'3141181','2020-04-25 12:09:22','食品;家用電器;');
      UPSERT INTO "ORDER_DTL" VALUES('2fc28d36-dca0-49e8-bad0-42d0602bdb40','已付款',3820,1,'9054826','2020-04-25 12:10:04','家用電器;;電腦;');
      UPSERT INTO "ORDER_DTL" VALUES('31477850-8b15-4f1b-9ec3-939f7dc47241','已提交',4650,2,'5837271','2020-04-25 12:08:52','機票;文娛;');
      UPSERT INTO "ORDER_DTL" VALUES('39319322-2d80-41e7-a862-8b8858e63316','已提交',5000,1,'5686435','2020-04-25 12:08:51','家用電器;;電腦;');
      UPSERT INTO "ORDER_DTL" VALUES('3d2254bd-c25a-404f-8e42-2faa4929a629','已完成',5000,1,'1274270','2020-04-25 12:08:43','男裝;男鞋;');
      UPSERT INTO "ORDER_DTL" VALUES('42f7fe21-55a3-416f-9535-baa222cc0098','已完成',3600,2,'2661641','2020-04-25 12:09:58','維修;手機;');
      UPSERT INTO "ORDER_DTL" VALUES('44231dbb-9e58-4f1a-8c83-be1aa814be83','已提交',3950,1,'3855371','2020-04-25 12:08:39','數碼;女裝;');
      UPSERT INTO "ORDER_DTL" VALUES('526e33d2-a095-4e19-b759-0017b13666ca','已完成',3280,0,'5553283','2020-04-25 12:09:01','食品;家用電器;');
      UPSERT INTO "ORDER_DTL" VALUES('5a6932f4-b4a4-4a1a-b082-2475d13f9240','已提交',50,2,'1764961','2020-04-25 12:10:07','家用電器;;電腦;');
      UPSERT INTO "ORDER_DTL" VALUES('5fc0093c-59a3-417b-a9ff-104b9789b530','已提交',6310,2,'1292805','2020-04-25 12:09:36','男裝;男鞋;');
      UPSERT INTO "ORDER_DTL" VALUES('605c6dd8-123b-4088-a047-e9f377fcd866','已完成',8980,2,'6202324','2020-04-25 12:09:54','機票;文娛;');
      UPSERT INTO "ORDER_DTL" VALUES('613cfd50-55c7-44d2-bb67-995f72c488ea','已完成',6830,3,'6977236','2020-04-25 12:10:06','酒店;旅遊;');
      UPSERT INTO "ORDER_DTL" VALUES('62246ac1-3dcb-4f2c-8943-800c9216c29f','已提交',8610,1,'5264116','2020-04-25 12:09:14','維修;手機;');
      UPSERT INTO "ORDER_DTL" VALUES('625c7fef-de87-428a-b581-a63c71059b14','已提交',5970,0,'8051757','2020-04-25 12:09:07','男鞋;汽車;');
      UPSERT INTO "ORDER_DTL" VALUES('6d43c490-58ab-4e23-b399-dda862e06481','已提交',4570,0,'5514248','2020-04-25 12:09:34','酒店;旅遊;');
      UPSERT INTO "ORDER_DTL" VALUES('70fa0ae0-6c02-4cfa-91a9-6ad929fe6b1b','已付款',4100,1,'8598963','2020-04-25 12:09:08','維修;手機;');
      UPSERT INTO "ORDER_DTL" VALUES('7170ce71-1fc0-4b6e-a339-67f525536dcd','已完成',9740,1,'4816392','2020-04-25 12:09:51','數碼;女裝;');
      UPSERT INTO "ORDER_DTL" VALUES('71961b06-290b-457d-bbe0-86acb013b0e3','已完成',6550,3,'2393699','2020-04-25 12:08:49','男鞋;汽車;');
      UPSERT INTO "ORDER_DTL" VALUES('72dc148e-ce64-432d-b99f-61c389cb82cd','已提交',4090,1,'2536942','2020-04-25 12:10:12','機票;文娛;');
      UPSERT INTO "ORDER_DTL" VALUES('7c0c1668-b783-413f-afc4-678a5a6d1033','已完成',3850,3,'6803936','2020-04-25 12:09:20','酒店;旅遊;');
      UPSERT INTO "ORDER_DTL" VALUES('7fa02f7a-10df-4247-9935-94c8b7d4dbc0','已提交',1060,0,'6119810','2020-04-25 12:09:21','維修;手機;');
      UPSERT INTO "ORDER_DTL" VALUES('820c5e83-f2e0-42d4-b5f0-83802c75addc','已付款',9270,2,'5818454','2020-04-25 12:10:09','數碼;女裝;');
      UPSERT INTO "ORDER_DTL" VALUES('83ed55ec-a439-44e0-8fe0-acb7703fb691','已完成',8380,2,'6804703','2020-04-25 12:09:52','男鞋;汽車;');
      UPSERT INTO "ORDER_DTL" VALUES('85287268-f139-4d59-8087-23fa6454de9d','已取消',9750,1,'4382852','2020-04-25 12:10:00','數碼;女裝;');
      UPSERT INTO "ORDER_DTL" VALUES('8d32669e-327a-4802-89f4-2e91303aee59','已提交',9390,1,'4182962','2020-04-25 12:09:57','機票;文娛;');
      UPSERT INTO "ORDER_DTL" VALUES('8dadc2e4-63f1-490f-9182-793be64fed76','已付款',9350,1,'5937549','2020-04-25 12:09:02','酒店;旅遊;');
      UPSERT INTO "ORDER_DTL" VALUES('94ad8ee0-8898-442c-8cb1-083a4b609616','已提交',4370,0,'4666456','2020-04-25 12:09:13','維修;手機;');
      UPSERT INTO "ORDER_DTL" VALUES('994cbb44-f0ee-45ff-a4f4-76c87bc2b972','已付款',3190,3,'3200759','2020-04-25 12:09:25','數碼;女裝;');
      UPSERT INTO "ORDER_DTL" VALUES('9ff3032c-8679-4247-9e6f-4caf2dc93aff','已提交',850,0,'8835231','2020-04-25 12:09:40','男鞋;汽車;');
      UPSERT INTO "ORDER_DTL" VALUES('9ff3032c-8679-4247-9e6f-4caf2dc93aff','已付款',850,0,'8835231','2020-04-25 12:09:45','食品;家用電器;');
      UPSERT INTO "ORDER_DTL" VALUES('a467ba42-f91e-48a0-865e-1703aaa45e0e','已提交',8040,0,'8206022','2020-04-25 12:09:50','家用電器;;電腦;');
      UPSERT INTO "ORDER_DTL" VALUES('a5302f47-96d9-41b4-a14c-c7a508f59282','已付款',8570,2,'5319315','2020-04-25 12:08:44','機票;文娛;');
      UPSERT INTO "ORDER_DTL" VALUES('a5b57bec-6235-45f4-bd7e-6deb5cd1e008','已提交',5700,3,'6486444','2020-04-25 12:09:27','酒店;旅遊;');
      UPSERT INTO "ORDER_DTL" VALUES('ae5c3363-cf8f-48a9-9676-701a7b0a7ca5','已付款',7460,1,'2379296','2020-04-25 12:09:23','維修;手機;');
      UPSERT INTO "ORDER_DTL" VALUES('b1fb2399-7cf2-4af5-960a-a4d77f4803b8','已提交',2690,3,'6686018','2020-04-25 12:09:55','數碼;女裝;');
      UPSERT INTO "ORDER_DTL" VALUES('b21c7dbd-dabd-4610-94b9-d7039866a8eb','已提交',6310,2,'1552851','2020-04-25 12:09:15','男鞋;汽車;');
      UPSERT INTO "ORDER_DTL" VALUES('b4bfd4b7-51f5-480e-9e23-8b1579e36248','已提交',4000,1,'3260372','2020-04-25 12:09:35','機票;文娛;');
      UPSERT INTO "ORDER_DTL" VALUES('b63983cc-2b59-4992-84c6-9810526d0282','已提交',7370,3,'3107867','2020-04-25 12:08:45','數碼;女裝;');
      UPSERT INTO "ORDER_DTL" VALUES('bf60b752-1ccc-43bf-9bc3-b2aeccacc0ed','已提交',720,2,'5034117','2020-04-25 12:09:03','機票;文娛;');
      UPSERT INTO "ORDER_DTL" VALUES('c808addc-8b8b-4d89-99b1-db2ed52e61b4','已提交',3630,1,'6435854','2020-04-25 12:09:10','酒店;旅遊;');
      UPSERT INTO "ORDER_DTL" VALUES('cc9dbd20-cf9f-4097-ae8b-4e73db1e4ba1','已付款',5000,0,'2007322','2020-04-25 12:08:38','維修;手機;');
      UPSERT INTO "ORDER_DTL" VALUES('ccceaf57-a5ab-44df-834a-e7b32c63efc1','已提交',2660,2,'7928516','2020-04-25 12:09:42','數碼;女裝;');
      UPSERT INTO "ORDER_DTL" VALUES('d7be5c39-e07c-40e8-bf09-4922fbc6335c','已付款',8750,2,'1250995','2020-04-25 12:09:09','食品;家用電器;');
      UPSERT INTO "ORDER_DTL" VALUES('dfe16df7-4a46-4b6f-9c6d-083ec215218e','已完成',410,0,'1923817','2020-04-25 12:09:56','家用電器;;電腦;');
      UPSERT INTO "ORDER_DTL" VALUES('e1241ad4-c9c1-4c17-93b9-ef2c26e7f2b2','已付款',6760,0,'2457464','2020-04-25 12:08:54','數碼;女裝;');
      UPSERT INTO "ORDER_DTL" VALUES('e180a9f2-9f80-4b6d-99c8-452d6c037fc7','已完成',8120,2,'7645270','2020-04-25 12:09:32','男鞋;汽車;');
      UPSERT INTO "ORDER_DTL" VALUES('e4418843-9ac0-47a7-bfd8-d61c4d296933','已付款',8170,2,'7695668','2020-04-25 12:09:11','家用電器;;電腦;');
      UPSERT INTO "ORDER_DTL" VALUES('e8b3bb37-1019-4492-93c7-305177271a71','已完成',2560,2,'4405460','2020-04-25 12:10:05','男裝;男鞋;');
      UPSERT INTO "ORDER_DTL" VALUES('eb1a1a22-953a-42f1-b594-f5dfc8fb6262','已完成',2370,2,'8233485','2020-04-25 12:09:24','機票;文娛;');
      UPSERT INTO "ORDER_DTL" VALUES('ecfd18f5-45f2-4dcd-9c47-f2ad9b216bd0','已付款',8070,3,'6387107','2020-04-25 12:09:04','酒店;旅遊;');
      UPSERT INTO "ORDER_DTL" VALUES('f1226752-7be3-4702-a496-3ddba56f66ec','已付款',4410,3,'1981968','2020-04-25 12:10:10','維修;手機;');
      UPSERT INTO "ORDER_DTL" VALUES('f642b16b-eade-4169-9eeb-4d5f294ec594','已提交',4010,1,'6463215','2020-04-25 12:09:29','男鞋;汽車;');
      UPSERT INTO "ORDER_DTL" VALUES('f8f3ca6f-2f5c-44fd-9755-1792de183845','已付款',5950,3,'4060214','2020-04-25 12:09:12','機票;文娛;');
    • Phoenix中查看

      select "id" from ORDER_DTL;

      [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-jRr1Xps3-1616545523619)(20210323_分佈式NoSQL列存儲數據庫Hbase(六).assets/image-20210323180117194.png)]

    • Hbase中查看

      scan 'ORDER_DTL'

      [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Zbm3siX0-1616545523620)(20210323_分佈式NoSQL列存儲數據庫Hbase(六).assets/image-20210323180201340.png)]

  • 總結

    • 由Phoenix來實現自動編碼,解決Rowkey的熱點問題,不須要本身設計散列的Rowkey

知識點17:Phoenix的使用:視圖

  • 需求

    • 直接關聯Hbase中的表,會致使誤刪除,對數據的權限會有影響,容易出現問題,如何避免?
  • 分析

    • Phoenix中建議使用視圖的方式來關聯Hbase中已有的表
    • 經過構建關聯視圖,能夠解決大部分數據查詢的數據,不影響數據
    • 視圖:理解爲只讀的表
  • 實現

    • 建立視圖,關聯Hbase中已經存在的表

      create view if not exists "MOMO_CHAT"."MSG" (
          "pk" varchar primary key, -- 指定ROWKEY映射到主鍵
          "C1"."msg_time" varchar,
          "C1"."sender_nickyname" varchar,
          "C1"."sender_account" varchar,
          "C1"."sender_sex" varchar,
          "C1"."sender_ip" varchar,
          "C1"."sender_os" varchar,
          "C1"."sender_phone_type" varchar,
          "C1"."sender_network" varchar,
          "C1"."sender_gps" varchar,
          "C1"."receiver_nickyname" varchar,
          "C1"."receiver_ip" varchar,
          "C1"."receiver_account" varchar,
          "C1"."receiver_os" varchar,
          "C1"."receiver_phone_type" varchar,
          "C1"."receiver_network" varchar,
          "C1"."receiver_gps" varchar,
          "C1"."receiver_sex" varchar,
          "C1"."msg_type" varchar,
          "C1"."distance" varchar
      );
    • 查詢數據

      select 
        "pk",
        "C1"."msg_time",
        "C1"."sender_account",
        "C1"."receiver_account" 
      from "MOMO_CHAT"."MSG" 
      limit 10;
  • 總結

    • 工做中主要構建的都是視圖
    • MySQL:視圖
      • Hive:外部表
      • Phoenix:視圖

知識點18:Phoenix的使用:JDBC

  • 需求

    • 工做中實際使用SQL,會基於程序中使用JDBC的方式來提交SQL語句,在Phoenix中如何實現?
  • 分析

    • Phoenix支持使用JDBC的方式來提交SQL語句

    • 例如:聊天分析案例中需求:查詢條件爲日期【年-月-日】 + 發送人ID + 接受人ID

      select 
        * 
      from "MOMO_CHAT"."MSG" 
      where 
        substr("msg_time",0,10) = '2021-03-22' 
        and "sender_account" = '17351912952' 
        and "receiver_account" = '17742251415';
    • 能夠在代碼中基於JDBC來提交SQL查詢

  • 實現

    • 構建JDBC鏈接Phoenix

      package cn.itcast.momo_chat.service.impl;
      
      import cn.itcast.momo_chat.entity.Msg;
      import cn.itcast.momo_chat.service.ChatMessageService;
      import org.apache.phoenix.jdbc.PhoenixDriver;
      
      import java.sql.*;
      import java.util.ArrayList;
      import java.util.List;
      
      /** * @ClassName PhoenixChatMessageService * @Description TODO JDBC鏈接Phoenix實現數據查詢 * @Create By Frank */
      public class PhoenixChatMessageService implements ChatMessageService {
          private Connection connection;
      
          public PhoenixChatMessageService() throws ClassNotFoundException, SQLException {
              try {
                  //申明驅動類
                  Class.forName(PhoenixDriver.class.getName());
      // System.out.println(PhoenixDriver.class.getName());
                  //構建鏈接
                  connection = DriverManager.getConnection("jdbc:phoenix:node1,node2,node3:2181");
              } catch (ClassNotFoundException e) {
                  throw new RuntimeException("加載Phoenix驅動失敗!");
              } catch (SQLException e) {
                  throw new RuntimeException("獲取Phoenix JDBC鏈接失敗!");
              }
          }
          @Override
          public List<Msg> getMessage(String date, String sender, String receiver) throws Exception {
              PreparedStatement ps = connection.prepareStatement(
                      "SELECT * FROM MOMO_CHAT.MSG T WHERE substr(\"msg_time\", 0, 10) = ? "
                              + "AND T.\"sender_account\" = ? "
                              + "AND T.\"receiver_account\" = ? ");
      
              ps.setString(1, date);
              ps.setString(2, sender);
              ps.setString(3, receiver);
      
              ResultSet rs = ps.executeQuery();
              List<Msg> msgList = new ArrayList<>();
      
              while(rs.next()) {
                  Msg msg = new Msg();
                  msg.setMsg_time(rs.getString("msg_time"));
                  msg.setSender_nickyname(rs.getString("sender_nickyname"));
                  msg.setSender_account(rs.getString("sender_account"));
                  msg.setSender_sex(rs.getString("sender_sex"));
                  msg.setSender_ip(rs.getString("sender_ip"));
                  msg.setSender_os(rs.getString("sender_os"));
                  msg.setSender_phone_type(rs.getString("sender_phone_type"));
                  msg.setSender_network(rs.getString("sender_network"));
                  msg.setSender_gps(rs.getString("sender_gps"));
                  msg.setReceiver_nickyname(rs.getString("receiver_nickyname"));
                  msg.setReceiver_ip(rs.getString("receiver_ip"));
                  msg.setReceiver_account(rs.getString("receiver_account"));
                  msg.setReceiver_os(rs.getString("receiver_os"));
                  msg.setReceiver_phone_type(rs.getString("receiver_phone_type"));
                  msg.setReceiver_network(rs.getString("receiver_network"));
                  msg.setReceiver_gps(rs.getString("receiver_gps"));
                  msg.setReceiver_sex(rs.getString("receiver_sex"));
                  msg.setMsg_type(rs.getString("msg_type"));
                  msg.setDistance(rs.getString("distance"));
      
                  msgList.add(msg);
              }
              return msgList;
          }
      
          @Override
          public void close() {
              try {
                  connection.close();
              } catch (SQLException e) {
                  e.printStackTrace();
              }
          }
      
      
          public static void main(String[] args) throws Exception {
              ChatMessageService chatMessageService = new PhoenixChatMessageService();
              List<Msg> message = chatMessageService.getMessage("2021-03-22", "17351912952", "17742251415");
      
              for (Msg msg : message) {
                  System.out.println(msg);
              }
      
              chatMessageService.close();
          }
      }
    • 運行查看結果

在這裏插入圖片描述

  • 總結

    • Phoenix支持SQL
    • 支持JDBC方式提交SQL語句實現數據處理
相關文章
相關標籤/搜索