IT技術互動交流平台

使用Phoenix將SQL代碼移植至HBase

來源_04400王中王开奖结果:IT165收集  發布日期|_苗条梅:2016-07-14 22:04:47

1.前言

HBase是雲計算環境下最重要的NOSQL數據庫-|锦皓,提供了基於Hadoop的數據存儲世纪星影院、索引_-拿铁咖啡、查詢|-铁路安全保护条例,其最大的優點就是可以通過硬件的擴展從而幾乎無限的擴展其存儲和檢索能力|_云天国际彩票怎么样。但是HBase與傳統的基於SQL語言的關係數據庫無論從理念還是使用方式上都相去甚遠-|-高考几天时间,以至於要將基於SQL的項目移植到HBase時往往需要重寫整個項目--_外箱唛头。
為了解決這個問題|__定陶教育网,很多開源項目提供了HBase的類SQL中間件_|_22选5好运3中奖规则,意即提供一種在HBase上使用的類SQL語言|-完颜璟,使得程序員能夠像使用關係數據庫一樣使用HBase||奇乐影院,Apache Phoenix就是其中的一個優秀項目_|-周俐彤。
本文介紹了如何將基於傳統關係數據庫的程序通過Apache Phoenix移植到基於HBase的雲計算平台上的方法_|陈炳德简历,並詳細講述了該過程中碰到的種種困難|_nokia6120c软件下载。主要內容包括---wow瑟银矿:

HBase及雲計算環境的安裝配置-|金莎巧克力保质期; HBase的Java API編程|||花亭湖风景区; Phoenix的安裝配置與使用___2019网上彩票送彩金; Squirrel的安裝配置與使用-2011手机qq; 使用Phoenix移植SQL代碼至HBase-|qq空间代码克隆; Phoenix性能調優__济南五中;

本文的讀者應該是數據庫係統項目的開發人員和維護人員__北部新区邮编,雲計算項目開發人員--|众彩网合法吗,最好具有以下基本知識-__金宝街电影院:

linux係統使用常識_||盈发彩票可信吗; Hadoop_-金手指v6、Hbase--十字星是什么意思、Zookeeper等雲計算環境使用常識|-长安街 英菲尼迪; Java編程開發基礎---娱乐天地有手机版本吗; SQL語言基礎--_金盛财智广场; Oracle||_苏州红星美凯龙活动、SQLServer或Mysql等關係數據庫使用管理基礎

2. HBase及雲計算環境的安裝配置

2.1 環境配置

雲計算環境通常安裝在linux或者CentOS等類UNIX操作係統中___徐娇个人资料,本文涉及的軟件至少需要三個|_-24en,即Hadoop--古董估价、Hbase和Zookeeper--|相容以莫,其版本號如下||云购彩票骗局揭秘:

hadoop-2.3.0-cdh5.1.0 zookeeper-3.4.5-cdh5.1.0 hbase-0.98.1-cdh5.1.0
注意_-老师给学生的毕业留言:本文使用了雲時代的版本5.1.0-_2019年特马生肖表,由於此類軟件版本眾多|夹心取力器,互相之間的兼容性複雜__|金寨房屋出租,因此最好統一采用cdh的版本-cctv10怪兽之谜视频。係統配置如下圖所示-0500彩票:
這裏寫圖片描述

係統一共六個節點_-爱家乡的诗歌,即Node1~Node6_民办教育促进法,hadoop安裝在全部六個節點上|-找个身份证号,其中Node1和Node2是NameNode||-闲鱼网二手网官网,其他是DataNode--众益下载;ZooKeeper安裝在Node4-__龙居长安、Node5和Node6上__小学生国旗下讲话,其端口使用默認的2181|||众彩国际app;Hbase安裝在Node1|_双线盗毒蛾、Node3~Node6上|-|许美静 倾城,其眾喎?http://www.weishengjin.biz/pro/pkqt/" target="_blank" class="keylink">QTm9kZTHKx0hNYXN0ZXKjrMbky/vKx0hSZWdpb25TZXJ2ZXKhoyA8YnI+Cr7fzOWyzsr9xeTWw7/J0tSyzr+8xuTL+87EtbWjrLTLtKayu9f2z+rPuMPoyvahoyA8YnI+CjxlbT7XotLio7q/zbuntsux2NDrzai5/Vpvb0tlZXBlctXStb1IYmFzZbXEyOu/2qGjttTT2r/Nu6fAtMu1o6zWu9Do0qrWqrXAWm9vS2VlcGVy1NrExLb5o7vQ6NKqt8POymhiYXNlyrGjrL/Nu6e2y8il1dJab29LZWVwZXKjrFpvb0tlZXBlctTZyKWy6dGvSEJhc2W1xEhNYXN0ZXK6zUhSZWdpb25TZXJ2ZXK1yNDFz6KjrL7fzOXH6b/2vPuhtkhCYXNlyrXVvaG3NjPSs6GjPC9lbT48L3A+Cgo8aDMgaWQ9"22-hbase-shell使用">2.2 HBase Shell使用

環境配置成功後|-2011澳网女单决赛,即可使用HBase Shell對HBase數據庫進行操作||诸葛智彩软件好用吗,類似於Oracle提供的sqlplus---11086移动彩票手机软件。
登陸任意一個安裝了HBase的服務器_-_永胜国际投彩,輸入|-长安街英菲尼迪:

hbase shell
list

即可列出該hbase中存儲的所有表格_|-苏州园区临时工招聘。
創建一個名為test的表格|||128彩票登陆,它帶有一個名為cf的列族---金立v8,並使用list來查看表格是否被創建__蛮荒之友,然後插入一些數據||云顶注册送25:

hbase(main):003:0> create 'test', 'cf'
0 row(s) in 1.2200 seconds
hbase(main):003:0> list
test
1 row(s) in 0.0550 seconds
hbase(main):004:0> put 'test', 'row1', 'cf:a', 'value1'
0 row(s) in 0.0560 seconds
hbase(main):005:0> put 'test', 'row2', 'cf:b', 'value2'
0 row(s) in 0.0370 seconds
hbase(main):006:0> put 'test', 'row3', 'cf:c', 'value3'
0 row(s) in 0.0450 seconds

使用scan來查看test表格中的內容_-|台风妮妲实时路径:

hbase(main):007:0> scan 'test'
ROW        COLUMN+CELL
row1       column=cf:a, timestamp=1288380727188, value=value1
row2       column=cf:b, timestamp=1288380738440, value=value2
row3       column=cf:c, timestamp=1288380747365, value=value3
3 row(s) in 0.0590 seconds

得到表中的一行數據|-|英雄哥华汉:

hbase(main):008:0> get 'test', 'row1'
COLUMN      CELL
cf:a        timestamp=1288380727188, value=value1
1 row(s) in 0.0400 seconds
disable和drop一個表格-||168娱乐2是什么平台:
hbase(main):012:0> disable 'test'
0 row(s) in 1.0930 seconds
hbase(main):013:0> drop 'test'
0 row(s) in 0.0770 seconds 

退出shell_--苏州名人馆:

hbase(main):014:0> exit

其他更多具體的命令請參看HBase的手冊或者在線幫助_仲博彩票黑过钱吗。

3. HBase Java API 編程

使用HBase的Java API進行開發需要掌握HBase的基本理念-__普拉达官网中文官方网,推薦閱讀《HBase實戰》一書|黑龙江移动网上营业厅详单查询。
在進行開發的操作係統(例如Windows__霞飞路、Linux或者CentOS)中解壓hbase-0.98.1-cdh5.1.0.tar.gz_008彩票论坛ii,得到開發所依賴的所有jar包||-106官方彩票com,位於hbase-0.98.1-cdh5.1.0/lib目錄中|__陈超贤。
在開發環境(例如Eclipse_-造梦西游3极品号源怎么用、NetBean或者Intellij)中建立工程_|-诛仙飞升任务,導入hbase-0.98.1-cdh5.1.0\lib中的所有jar包---聚餐团购。

3.1 關於遠程連接HBase

在給出源代碼之前-永宁县政府公众网,先介紹一下遠程連接HBase的問題|--大色老。從Oracle時代過來的程序員autocad2004下载,顯然期望得到數據庫服務器的ip_|金城江租房信息、port和Service Name之類的信息|_|水果批发商。但是在連接HBase時|_中国梦想秀圆梦专场,你需要的卻是一個或多個ZooKeeper服務器的ip(或者hostname)和port_许喵喵mickey,因為隻有它才知曉整個HBase集群的元數據||_1rdt军海。
顯然_|不灭之王波罗丁称号怎么做,使用hostname比使用ip要顯得習慣更好__阜新华博网,因為它帶來了更大的可移植性__乔洋演唱会,因此費一點筆墨講講linux和windows的hostname設置-_132彩票ios手机版。
在linux下-|河南省焊工证查询,hostname通過修改/etc/hosts文件來完成_|新浪微博阅读,在集群的每台服務器上加入如下內容||易发彩票是不是黑平台:

192.168.1.101  Node1
192.168.1.102  Node2
192.168.1.103  Node3
192.168.1.104  Node4
192.168.1.105  Node5
192.168.1.106  Node6

在各自的/etc/sysconfig/network文件中|_|苗老表,將“HOSTNAME=”修改為“HOSTNAME=Node?”(將Node?替換為本服務器的hostname)_-_河北区haobc。
在Windows下(僅測試過Win7 64)--|盈彩网彩票贴吧,修改Windows/System32/drivers/etc/hosts文件-_盈盈彩口碑怎么样,加入_|13彩票平台:

192.168.1.101  Node1
192.168.1.102  Node2
192.168.1.103  Node3
192.168.1.104  Node4
192.168.1.105  Node5
192.168.1.106  Node6

(不同的windows平台hosts文件的位置可能不一樣--阴齿2 百度影音,建議裝一個everything-_|盈众彩票平台怎么样,桌麵搜索速度極快)-_阿鲁科尔沁旗绿原网。
其實多種方法都可以連接到ZooKeeper|--南安市委书记,例如ip加端口_35彩票官方:

public static String hbase_svr_ip = "192.168.1.104, 192.168.1.105, 192.168.1.106";
public static String hbase_svr_port = "2181";

或者hostname加端口_-赢彩彩票账号怎么注销:

public static String hbase_svr_hostname = "Node4,Node5,Node6";
public static String hbase_svr_port = "2181";

或者將端口直接寫在ip後|卓易彩票里的钱怎么取:

public static String hbase_svr_ip = "192.168.1.104:2181, 192.168.1.105:2181, 192.168.1.106:2181";

或者將端口直接寫在hostname後-|进口货物报关单样本:

public static String hbase_svr_hostname = "Node4:2181,Node5:2181,Node6:2181";

或者僅使用一個ZooKeeper服務器-|_苏菲的日记:

public static String hbase_svr_hostname = "Node4:2181";

具體使用哪種方法就看程序員自己的偏好-|_闫雪瑞,也存在某種方法在某些版本中可能無法連接的問題--黑社会砍人电影,本文中沒有窮盡測試-_洪秀全公园,但個人認為hostname加端口的方法可能比較穩妥-||福益康托玛琳能量杯。

3.2 源代碼

本篇給出了使用Java API操作HBase的源代碼||2019王中王论坛资料,注意要將這幾行替換為實際的ZooKeeper服務器地址|_|龙玛显脉片、hostname和端口號_|_塔河贴吧:

public static String hbase_svr_ip = "192.168.1.104, 192.168.1.105, 192.168.1.106";
public static String hbase_svr_port = "2181";
public static String hbase_svr_hostname = "Node4,Node5,Node6";

代碼功能包括|-_0567彩票网页:

遠程連接Hbase數據庫__尹国驹; 創建表-|-清真标志; 掃描所有表|娱乐天地点检手机登录; 插入數據--网上三好街报价; 掃描數據|康熙与太子妃高h; 刪除數據|_易中彩票怎么样; 刪除表_托儿费。
package com.wxb;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HConnection;
import org.apache.hadoop.hbase.client.HConnectionManager;
import org.apache.hadoop.hbase.client.HTableInterface;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.util.Bytes;

/**
 * @author wxb hbase的基本操作方法
 */
public class HBaseSample {
public static String hbase_svr_ip = "192.168.1.104, 192.168.1.105, 192.168.1.106";
    public static String hbase_svr_port = "2181";
    public static String hbase_svr_hostname = "Node4,Node5,Node6";
    private HConnection connection = null;
    Configuration config = null;

    /**
     * 構造函數||365彩票官网,構造一個HBaseSample對象-_-小县城里的故事,必須在最後調用close方法來關閉所有的連接__手机qq2010免费下载,釋放所有的資源
     */
    public HBaseSample() {
        config = HBaseConfiguration.create();
        config.set("hbase.zookeeper.quorum", hbase_svr_hostname);
        config.set("hbase.zookeeper.property.clientPort", hbase_svr_port);
        // System.out.println(config.get("hbase.zookeeper.quorum"));
        // System.out.println(config.get("hbase.zookeeper.property.clientPort"));

        try {
            connection = HConnectionManager.createConnection(config);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 釋放資源
     */
    public void close() {
        try {
            if (null != connection) {
                connection.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 創建表格
     * 
     * @param tableName
     * @param columnFarily
     */
    public void createTable(final String tableName, String columnFarily) {
        if (null != config) {
            System.out.println("begin create table...");
            HBaseAdmin admin = null;
            try {
                admin = new HBaseAdmin(config);
                if (admin.tableExists(tableName)) {
                    System.out.println(tableName + " is already exist!");
                } else {
                    HTableDescriptor tableDesc = new HTableDescriptor(tableName);
                    tableDesc.addFamily(new HColumnDescriptor(columnFarily));
                    admin.createTable(tableDesc);
                    System.out.println(tableDesc.toString()
                            + " has been created.");
                }
                admin.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            System.out.println("hbase could not connected!");
        }
    }

    /**
     * 向指定表格中添加一行數據
     * 
     * @param table
     * @param key
     * @param family
     * @param col
     * @param dataIn
     * @return
     */
    public boolean addOneRecord(String table, String key, String family,
            String col, byte[] dataIn) {
        if (null != connection) {
            try {
                HTableInterface tb = connection.getTable(table);
                Put put = new Put(key.getBytes());
                put.add(family.getBytes(), col.getBytes(), dataIn);
                tb.put(put);
                System.out.println("put data key = " + key);
                return true;
            } catch (IOException e) {
                System.out.println("put data failed.");
                return false;
            }
        } else {
            System.out.println("hbase could not connected!");
            return false;
        }
    }

    /**
     * 得到hbase中所有的表
     * 
     * @return
     */
    public List<String> getAllTables() {
        List<String> tables = null;
        if (connection != null) {
            try {
                HTableDescriptor[] allTable = connection.listTables();
                if (allTable.length > 0)
                    tables = new ArrayList<String>();
                for (HTableDescriptor hTableDescriptor : allTable) {
                    tables.add(hTableDescriptor.getNameAsString());
                    System.out.println(hTableDescriptor.getNameAsString());
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            System.out.println("hbase could not connected!");
        }
        return tables;
    }

    public byte[] getValueWithKey(String tableName, String rowKey,
            String family, String qualifier) {
        byte[] rel = null;
        if (null != connection) {
            try {
                HTableInterface table = connection.getTable(tableName);
                Get get = new Get(rowKey.getBytes());
                get.addColumn(Bytes.toBytes(family), Bytes.toBytes(qualifier));
                Result result = table.get(get);
                if (!result.isEmpty()) {
                    rel = result.getValue(Bytes.toBytes(family),
                            Bytes.toBytes(qualifier));
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            System.out.println("hbase could not connected!");
        }
        return rel;
    }

    /**
     * 從表中刪除一行
     * 
     * @param tableName
     * @param rowKey
     */
    public void deleteWithKey(String tableName, String rowKey) {
        if (null != connection) {
            try {
                HTableInterface table = connection.getTable(tableName);
                Delete delete = new Delete(rowKey.getBytes());
                table.delete(delete);
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            System.out.println("hbase could not connected!");
        }
    }

    /**
     * 得到一個表中的所有元素
     * 
     * @param tableName
     */
    public void getAllData(String tableName) {
        if (null != connection) {
            try {
                HTableInterface table = connection.getTable(tableName);
                Scan scan = new Scan();
                ResultScanner rs = table.getScanner(scan);
                for (Result r : rs) {
                    Cell[] cells = r.rawCells();
                    System.out.println("This row have " + cells.length
                            + " cells:");
                    for (Cell cell : cells) {
                        String row = Bytes.toString(CellUtil.cloneRow(cell));
                        String family = Bytes.toString(CellUtil
                                .cloneFamily(cell));
                        String qualifier = Bytes.toString(CellUtil
                                .cloneQualifier(cell));
                        String value = Bytes
                                .toString(CellUtil.cloneValue(cell));
                        System.out.println(String.format("%s:%s:%s:%s", row,
                                family, qualifier, value));
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            System.out.println("hbase could not connected!");
        }
    }

    public void deleteTable(String tableName) {
        if (null != config) {
            System.out.println("begin delete table...");
            HBaseAdmin admin = null;
            try {
                admin = new HBaseAdmin(config);
                if (!admin.tableExists(tableName)) {
                    System.out.println(tableName + " is not exist!");
                } else {
                    admin.disableTable(tableName);
                    admin.deleteTable(tableName);
                    System.out.println(tableName + " has been deleted.");
                }
                admin.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            System.out.println("hbase could not connected!");
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        HBaseSample sample = new HBaseSample();
        // 1.create table and insert data
        sample.createTable("student", "fam1");
        sample.addOneRecord("student", "id1", "fam1", "name", "Jack".getBytes());
        sample.addOneRecord("student", "id1", "fam1", "address",
                "HZ".getBytes());

        // 2.list table
        sample.getAllTables();

        // 3.getValue
        byte[] value = sample.getValueWithKey("student", "id1", "fam1",
                "address");
        System.out.println("value = " + Bytes.toString(value));

        // 4.addOneRecord and delete
//      sample.addOneRecord("student", "id2", "fam1", "name", "wxb".getBytes());
//      sample.addOneRecord("student", "id2", "fam1", "address",
//              "here".getBytes());
//      sample.deleteWithKey("student", "id2");

        // 5.scan table
        sample.getAllData("student");

        // 6.delete table
        // sample.deleteTable("student");

        sample.close();
    }
}

4. Phoenix的安裝配置與使用

從上一章可以看出-易旺彩票窍门,HBase的基本理念和傳統的關係數據庫是截然不同的_|仙缘 云朵朵之家,為了使得熟悉SQL的程序員能夠快速使用HBase|杨家坪ume,使用Apache Phoenix是比較好的辦法-_300203。它提供了一組類似於SQL的語法__运盛彩票玩法,以及序列_|淘宝购物车参数错误、索引-奎比历斯、函數等工具_--众盈娱乐坑人,使得將SQL代碼移植至HBase成為可能||-132彩票app。

4.1 Phoenix安裝

同其他分布式軟件一樣|__361娱乐彩票平台登录,Phoenix的安裝也是較為複雜的-中央6,且要密切關注其版本兼容性|-_苏州化工医院,否則很可能無法正常運行_|_苏州工业园区三中。例如Phoenix4.x版本都有兼容HBase0.98的版本|-膏良,但是經過兩天的測試才發現不同的Phoenix版本對HBase0.98的小版本號的要求不同-重返神州。
由於本文使用的是HBase0.98.1_||静安工人体育场,因此隻能使用Phoenix4.1.0版本--queena什么意思。如果使用的Phoenix版本和HBase版本不兼容_-p44小游戏,會出現第一次能夠連接HBase-__运盛彩票注册,但以後都連接失敗的現象|118彩票安装苹果。
Phoenix的具體安裝步驟如下--_云购彩票登录:
第一步-|-优乐彩彩票开奖官方网:將phoenix-4.1.0-bin.tar.gz拷貝到Node1(HBase的HMaster)的某路徑下_-现代科技成就的例子,解壓縮||-艾尔之光宠物食物,拷貝hadoop2/phoenix-4.1.0-server-hadoop2.jar到HBase的lib目錄下___浠水姜林。
第二步_-众赢彩票合法吗:然後用scp(關於scp和ssh的設置請參考網上的其他文章-|-万文网校,假設用戶名為hadoop)拷貝到各個regionserver的HBase的lib目錄下|-_立冬立秋诗句:

scp phoenix-4.1.0-server-hadoop2.jar hadoop@Node3:/home/hadoop/hbase-0.98.1-cdh5.1.0/lib/
phoenix-core-4.6.0-HBase-0.98.jar                                                                                                    
scp phoenix-4.1.0-server-hadoop2.jar hadoop@Node4:/home/hadoop/hbase-0.98.1-cdh5.1.0/lib/
phoenix-core-4.6.0-HBase-0.98.jar                                                                                                  
scp phoenix-4.1.0-server-hadoop2.jar hadoop@Node5:/home/hadoop/hbase-0.98.1-cdh5.1.0/lib/
phoenix-core-4.6.0-HBase-0.98.jar
scp phoenix-4.1.0-server-hadoop2.jar hadoop@Node6:/home/hadoop/hbase-0.98.1-cdh5.1.0/lib/
phoenix-core-4.6.0-HBase-0.98.jar            

第三步|_|苏州街长远天地:在HMaster上重啟hbase(即Node1)-西玛屋;
第四步-_-至尊联盟彩种平台:將phoenix-4.1.0-client-hadoop2.jar加入客戶端的CLASSPATH變量路徑中|海葬费用,修改用戶的.bash_profile文件-_|餐饮加盟店10大品牌,同時將此文件拷貝到hbase的lib目錄下_莱州中考成绩。
第五步_-元素太初:測試使用phoenix-_九纵新一团,輸入命令_|优信彩票平台登录:

sqlline.py Node4:2181

注意-__王的第十七妾:後麵的參數是ZooKeeper的服務器和端口-|-雅虎 翻译。
出現以下顯示則說明連接成功--老娘舅2013。

[hadoop@iips25 hadoop2]$bin/sqlline.py Node1:2181
Setting property: [isolation, TRANSACTION_READ_COMMITTED]
issuing: !connect jdbc:phoenix:Node4 none none org.apache.phoenix.jdbc.PhoenixDriver
Connecting to jdbc:phoenix:Node4
16/06/21 08:04:24 WARN impl.MetricsConfig: Cannot locate configuration: tried hadoop-metrics2-phoenix.properties,hadoop-metrics2.properties
Connected to: Phoenix (version 4.1)
Driver: org.apache.phoenix.jdbc.PhoenixDriver (version 4.1)
Autocommit status: true
Transaction isolation: TRANSACTION_READ_COMMITTED
Building list of tables and columns for tab-completion (set fastconnect to true to skip)...
59/59 (100%) Done
Done
sqlline version 1.1.2
0: jdbc:phoenix:Node4>

查看數據庫表--2019香港赛马比赛:(注意_|-1号计划app,phoenix隻能看到自己創建的表_东京热美女,不能看到HBase創建的表)

0: jdbc:phoenix:Node4> !tables
+------------+-------------+------------+------------+------------+------------+---------------------------+----------------+-------------+----------------+--------+
| TABLE_CAT  | TABLE_SCHEM | TABLE_NAME | TABLE_TYPE |  REMARKS   | TYPE_NAME  | SELF_REFERENCING_COL_NAME | REF_GENERATION | INDEX_STATE | IMMUTABLE_ROWS | SALT_B |
+------------+-------------+------------+------------+------------+------------+---------------------------+----------------+-------------+----------------+--------+
| null       | SYSTEM      | CATALOG    | SYSTEM TABLE | null       | null       | null                      | null           | null        | false          | null |
| null       | SYSTEM      | SEQUENCE   | SYSTEM TABLE | null       | null       | null                      | null           | null        | false          | null |
+------------+-------------+------------+------------+------------+------------+---------------------------+----------------+-------------+----------------+--------+
0: jdbc:phoenix:Node4>

創建表|--亿彩软件,並插入數據-_2m彩票2m永久费资料:

0: jdbc:phoenix:Node4> create table abc(a integer primary key, b integer) ;
No rows affected (1.133 seconds)
0: jdbc:phoenix:Node4> UPSERT INTO abc VALUES (1, 1); 
1 row affected (0.064 seconds)
0: jdbc:phoenix:Node4> UPSERT INTO abc VALUES (2, 2); 
1 row affected (0.009 seconds)
0: jdbc:phoenix:Node4> UPSERT INTO abc VALUES (3, 12); 
1 row affected (0.009 seconds)
0: jdbc:phoenix:Node4> select * from abc;
+------------+------------+
|     A      |     B      |
+------------+------------+
| 1          | 1          |
| 2          | 2          |
| 3          | 12         |
+------------+------------+
3 rows selected (0.082 seconds)
0: jdbc:phoenix:Node4>

創建包含中文的表(注意中文要使用VARCHAR)-_沈绛红:

create table user ( id integer primary key, name VARCHAR);
upsert into user values ( 2, '測試員2');
upsert into user values ( 1, '測試員1');
select * from user;
+------------+------------+
|     ID     |    NAME    |
+------------+------------+
| 1          | 測試員1        |
| 2          | 測試員2         |

4.2 phoenix配置

在hbase集群每個服務器的hbase-site.xml配置文件中_--高中研究性学习范文,加入__|金条树:

<property>
  <name>hbase.regionserver.wal.codec</name>
  <value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
</property>

這是在phoenix中建立索引的先決條件-_堂色品。如果不添加此設置-兰州商学院长青学院教务,Phoenix依然可以正常使用|_雨过天晴序列号,但不能建立索引-掌上彩票是正规的吗。

4.3 phoenix語法簡介

phoenix的語法可參考其官方網站-_易彩网多少钱可以提现,也可下載其“Grammar _ Apache Phoenix.html”網頁-|_2013江苏高考数学。
訪問Phoenix時__2019黑彩打击力度,可以使用其提供的sqlline.py命令||陈光标肩挑钞票捐款,也可以使用下一章介紹的數據庫圖形界麵工具Squirrel__|皇家马德里电影,當然也可以通過Phoenix提供的Java API||淘花运。

4.3.1. 創建表

注意|-锰钢属于:Phoenix中的表必須有主鍵_-_198彩手机平台登录,這一點和許多關係數據庫不同-||暗夜玫瑰sp。因為主鍵是後續很多表操作的必備因素_--8万以下什么车好。

CREATE TABLE IF NOT EXISTS MYTABLE (ID INTEGER PRIMARY KEY, NAME VARCHAR, SEX VARCHAR, ADDRESS VARCHAR);

4.3.2. 刪除表

DROP TABLE IF EXISTS MYTABLE;

4.3.3. 插入數據

UPSERT INTO MYTABLE VALUES (1, 'WXB', 'MALE', '010-22222222');

注意phoenix使用UPSERT而不是INSERT-_|360彩票详情。

4.3.4. 刪除數據

DELETE FROM MYTABLE WHERE ID = 1;

4.3.5. 查詢數據

SELECT * FROM MYTABLE WHERE ID=1;

4.3.6. 修改數據

UPSERT INTO MYTABLE VALUES (1, 'WXB', 'MALE', '010-22222222');

可以看到--掌上彩票官网登录,修改數據與插入數據一樣_-_云顶娱乐李逵捕鱼,都是使用UPSERT語句|尊彩app下载,若此主鍵對應的行不存在-|陈奎元简历,就插入--_wow暗月岛怎么去,否則就修改_--travalue。這也是為什麼Phoenix的表必須有主鍵的原因之一|中博彩票平台贴吧。

4.3.7. 創建序列

Phoenix的序列與Oracle很像-|诛仙漫画下载,也是先創建-|上海哪里买书便宜,然後調用next得到下一個值|-|qq2009下载。也可以繼續調用current value得到當前序列值__陆贞传奇陆贞身世,沒有調用next時|_仲博彩票怎么注册账号,不能使用current value--朵朵邮购。
創建一個序列_张柏芝约谈谢霆锋:

CREATE SEQUENCE IF NOT EXISTS WXB_SEQ START WITH 1000 INCREMENT BY 1 MINVALUE 1000 MAXVALUE 999999999 CYCLE CACHE 30;

其含義基本上與Oracle類似__许嵩违章动物mv。

4.3.8. 使用序列

序列隻能在Select或者Upsert語句中使用-|优信彩票登录,例如在Upsert中使用_||致命之剑:

UPSERT INTO MYTABLE VALUES (NEXT VALUE FOR WXB_SEQ, 'WXB', 'MALE', '010-22222222');

讀取序列的當前值時-|河北区haobc,采用這個語句__中乙联赛官网:

SELECT CURRENT VALUE FOR WXB_SEQ DUALID FROM WXB_DUAL;

然後讀取DUALID就可得到序列的當前值--陈瑞围棋道场。
這裏的WXB_DUAL是我自己創建的一個特殊表-_|索爱w550c刷机,用來模擬Oracle中的Dual表---亿点卡盟平台。

CREATE TABLE  IF NOT EXISTS WXB_DUAL (DUALID INTEGER PRIMARY KEY );
UPSERT INTO WXB_DUAL VALUES (1);

4.3.9. 刪除序列

DROP SEQUENCE IF EXISTS WXB_SEQ;

本章至此為止_-注册送300元现金老虎机,詳細的操作留待後續再講-1号彩网下载。

5. 安裝SQuirrel

Squirrel是一個圖形化的數據庫工具-|-丝丝发图片,它可以將Phoenix以圖形化的方式展示出來-|_锐骐zd30,它可以安裝在windows或linux係統中-__脉动测速。

5.1 安裝步驟

第一步-|_卢光霖:
設置好JDK-||078彩票平台登录,JAVA_HOME-__大连大商新玛特招聘,CLASSPATH等一係列的環境變量-|-无叶涡轮增压器,注意無論是在windows還是在linux下|-药草悠悠芳草香,都需要上麵安裝的hbase和phoenix的存放jar包的目錄|小学生秋诗网网,並將其設置到CLASSPATH中-|_观澜茗语华苑。windows下的CLASSPATH如下_长春房地产报:

%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;D:\hbase-0.98.1-cdh5.1.0\lib;D:\phoenix-4.1.0-bin\hadoop2

linux的CLASSPATH如下-_-印度新娘第四部:

export PHOENIX_HOME=/home/hadoop/phoenix-4.1.0-bin
export CLASSPATH=$PHOENIX_HOME/hadoop2/phoenix-4.1.0-client-hadoop2.jar:$HBASE_HOME/lib/:$CLASSPATH
export PATH=$PHOENIX_HOME/bin:$PATH

第二步--_众博彩票平台:
下載解壓squirrel-sql-snapshot-20160613_2107-standard.jar(最新版本的squirrel安裝包)-_365高反水彩票平台,在命令行中運行java -jar squirrel-sql-snapshot-20160613_2107-standard.jar開始安裝_-阿诺德蓄电池。
第三步-|3g彩票开奖:執行如下安裝
1. Remove prior phoenix-[oldversion]-client.jar from the lib directory of SQuirrel, copy phoenix-[newversion]-client.jar to the lib directory (newversion should be compatible with the version of the phoenix server jar used with your HBase installation)
2. Start SQuirrel and add new driver to SQuirrel (Drivers -> New Driver)
3. In Add Driver dialog box, set Name to Phoenix, and set the Example URL to jdbc:phoenix:localhost.
4. Type “org.apache.phoenix.jdbc.PhoenixDriver” into the Class Name textbox and click OK to close this dialog.
5. Switch to Alias tab and create the new Alias (Aliases -> New Aliases)
6. In the dialog box, Name:Any name, Driver: Phoenix, User Name:Anything, Password:Anything
7. Construct URL as follows: jdbc:phoenix:zookeeper quorum server. For example, to connect to a local HBase use: jdbc:phoenix:localhost
8. Press Test (which should succeed if everything is setup correctly) and press OK to close.
9. Now double click on your newly created Phoenix alias and click Connect. Now you are ready to run SQL queries against Phoenix.
注意_|-玫琳凯之窗登录,我們連接的URL是jdbc:phoenix:Node4_-|二胡有几根琴弦,用戶名和密碼隨意即可--_订货会主持词。連接成功後-|-日奈森亚梦h,如下-_索爱w550c刷机:
這裏寫圖片描述

5.2 使用

安裝完畢後_--众购彩票,就可以在Squirrel中執行各種phoenix支持的類SQL語句和觀察數據了_|_诺基亚7280,例如在SQL欄中輸入如下語句---诛仙飞升任务:

CREATE TABLE IF NOT EXISTS MYTABLE (ID INTEGER PRIMARY KEY, NAME VARCHAR, SEX VARCHAR, ADDRESS VARCHAR);

UPSERT INTO MYTABLE VALUES (1, 'WXB', 'MALE', '010-22222222');

UPSERT INTO MYTABLE VALUES (2, ‘LL’, 'MALE', '010-11111111');

SELECT * FROM MYTABLE;

結果如下_-|晨星基金业绩排行榜:
這裏寫圖片描述
使用Squirrel的好處在於可以方便的查看數據庫中的各種對象-|mc擦皮鞋麦词,以及編輯和執行複雜的phoenix類sql腳本_--亿彩彩票平台可靠吗?。

6. 使用Phoenix移植SQL代碼至HBase

Phoenix提供了完全適配JDBC的API|--39彩票的手机网站,程序員可以像操作關係數據庫(例如Oracle)一樣來使用JDBC來操作Phoenix-_常州模具城,這也是Phoenix的最大的優勢所在_-怀柔人力资源招聘网。唯一需要注意的是__约彩彩票安全吗,提交的SQL語句必須符合Phoenix語法-笑刑大唐txt下载,雖然此語法很類似於SQL-_cf修复工具,但還是有許多不同之處|__刑天铠甲后传全集。

6.1 Phoenix Java Coding

本章給出了一個最基本的Phoenix JDBC源代碼實例||鱼翅价格,注意其中所引用的所有類幾乎都來自於java.sql.*包|_|诺卡n9,與Oracle唯一的不同是其driver的字符串-_莱克帝卡,該字符串等於前麵連接Squirrel的連接字符串__|爱家乡的诗歌,你可以在Squirrel上測試driver字符串是否能夠正確連接__观澜茗语华苑。driver字符串一般為jdbc:phoenix:ZooKeeper_hostname:port-|-鱼翅价格,例如jdbc:phoenix:Node4,Node5,Node6:2181_|_教师师德论文。但是在端口為默認2181端口時_-_花为眉男主角,也可以省略端口號--口碑网 长沙。
編碼之前將phoenix-4.1.0-client-hadoop2.jar加入java項目的依賴Libraries||-惠安三中网,例子代碼如下云顶娱乐怎么钱取不到?:

package com.wxb;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * @author wxb  Phoenix的基本操作方法
 * 
 */
public class PhoenixSample {
    public static String hbase_svr_ip = "192.168.1.104, 192.168.1.105, 192.168.1.106";
    public static String hbase_svr_port = "2181";
    public static String hbase_svr_hostname = "Node4,Node5,Node6";

    /*
     * 所有幾種方式的driver都能夠通過測試_-邮政上班时间: 1.Node4 2.Node4,Node5,Node6 3.Node4:2181
     * 4.Node4,Node5,Node6:2181 5.Node4:2181,Node5:2181,Node6:2181
     * 6.101.60.27.114
     */
    public static String driver = "jdbc:phoenix:" + hbase_svr_hostname;

    public static void createTable(String tableName) {
        System.out.println("create table " + tableName);
        Statement stmt = null;

        try {
            Connection con = DriverManager.getConnection(driver);
            stmt = con.createStatement();

            stmt.executeUpdate("create table  if not exists " + tableName
                    + " (mykey integer not null primary key, mycolumn varchar)");
            con.commit();
            con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void addRecord(String tableName, String values) {
        Statement stmt = null;

        try {
            Connection con = DriverManager.getConnection(driver);
            stmt = con.createStatement();

            stmt.executeUpdate("upsert into " + tableName + " values ("
                    + values + ")");
            con.commit();
            con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void deleteRecord(String tableName, String whereClause) {
        Statement stmt = null;

        try {
            Connection con = DriverManager.getConnection(driver);
            stmt = con.createStatement();

            stmt.executeUpdate("delete from " + tableName + " where "
                    + whereClause);
            con.commit();
            con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void createSequence(String seqName) {
        System.out.println("Create Sequence :" + seqName);
        Statement stmt = null;

        try {
            Connection con = DriverManager.getConnection(driver);
            stmt = con.createStatement();

            stmt.executeUpdate("CREATE SEQUENCE IF NOT EXISTS "
                    + seqName
                    + " START WITH 1000 INCREMENT BY 1 MINVALUE 1000 MAXVALUE 999999999 CYCLE CACHE 30");
            con.commit();
            con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void dropSequence(String seqName) {
        System.out.println("drop Sequence :" + seqName);
        Statement stmt = null;

        try {
            Connection con = DriverManager.getConnection(driver);
            stmt = con.createStatement();

            stmt.executeUpdate("DROP SEQUENCE IF EXISTS " + seqName);
            con.commit();
            con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void getAllData(String tableName) {

        System.out.println("Get all data from :" + tableName);
        ResultSet rset = null;

        try {
            Connection con = DriverManager.getConnection(driver);
            PreparedStatement statement = con.prepareStatement("select * from "
                    + tableName);
            rset = statement.executeQuery();
            while (rset.next()) {
                System.out.print(rset.getInt("mykey"));
                System.out.println(" " + rset.getString("mycolumn"));
            }
            statement.close();
            con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void dropTable(String tableName) {

        Statement stmt = null;

        try {
            Connection con = DriverManager.getConnection(driver);
            stmt = con.createStatement();

            stmt.executeUpdate("drop table  if  exists " + tableName);
            con.commit();
            con.close();
            System.out.println("drop table " + tableName);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        createTable("wxb_test");
        createSequence("WXB_SEQ_ID");

        // 使用了Sequence
        addRecord("wxb_test", "NEXT VALUE FOR WXB_SEQ_ID,'wxb'");
        addRecord("wxb_test", "NEXT VALUE FOR WXB_SEQ_ID,'wjw'");
        addRecord("wxb_test", "NEXT VALUE FOR WXB_SEQ_ID,'wjl'");

        // deleteRecord("wxb_test", " mykey = 1 ");
        getAllData("wxb_test");

        // dropTable("wxb_test");
//      dropSequence("WXB_SEQ_ID");

    }
}

6.2 每個表必須包含一個主鍵

在使用Phoenix時_|河南高等教育自学考试考生服务平台,建立的每個表都必須包含一個主鍵||3号彩票代理,這與關係數據庫不同|-金立a5软件下载。而且每個表的主鍵會自動被索引|_钱学森的女儿,這意味著在select語句的where子句中使用主鍵作為條件-__永胜国际怎么样,會得到最快的查詢速度__神秘顾客招聘。關於索引-_|拥抱江美琪,在後續章節中再詳細介紹||创维酷开液晶电视。
我的建議是_-|10年的信誉彩票平台,為每個表創建一個序列|_105彩票APP,並在插入數據時以序列的值作為主鍵的值-_|香港大学集体欺凌。

6.3 JDBC連接池

Phoenix支持用戶自己創建JDBC連接池-|-诺基亚6120c游戏,可以將基於JDBC連接池的代碼複製過來-优彩娱乐正规的吗,把Driver部分修改一番即可_||至尊彩平台是合法的吗。

6.4 中文支持

涉及中文的字段可設置為VARCHAR類型||-132彩票苹果版,經測試沒有問題_|民办教育促进法。

6.5 CLOB和BLOB

CLOB和BLOB字段我都設置為VARCHAR類型-_传说中勇者的传说2,經測試存儲400k字節的數據沒有問題|_长春新天地电影院,更多的沒有測試||花中仙子是什么花。

6.6 複雜的SQL語句

因為本文使用的Phoenix版本不是最新版-__众博彩票官网,因此官網上給出的SQL語法不是完全都能夠支持-||郑浩南三级,例如下麵的語句就不能支持_||女人二十种外阴:

delete from wxb_senword where swid in (select swid from wxb_rela_sw_group where groupid=1)

因此對於一些複雜的SQL語句_帮我起个好听的网名,需要先到官網上查詢語法-至尊彩是骗局吗?,然後在phoenix中進行測試_-132彩票APP苹果,測試通過後才能夠在程序中使用-|电话拜年。
兩個表的關聯查詢是可行的_|云购彩票是正规平台吗,語句如下-|云顶娱乐招收代理:

SELECT d.swid,d.swname, d.userid, e.groupid FROM wxb_senword d JOIN wxb_rela_sw_group e ON e.swid = d.swid where e.groupid=1;

7. Phoenix性能調優

7.1 代碼移植流程

將基於SQL的java代碼移植到Phoenix其實不難_--花生壳连接失败,以Oracle為例-_钢筋浴室,基本流程如下-||众赢国际官网下载:

將Oracle中的所有表在Phoenix中重新建立一次|-_电厂液动调节蝶阀,沒有主鍵的自己加一個主鍵(並建立對應的序列)|-1010时时彩APP; 將Oracle中所有的序列-|uc蝴蝶版下载、視圖都在Phoenix中重新建立一次--13彩怎么玩不亏; 將程序中的每條SQL語句都翻譯為Phoenix的SQL語句--河间吧,並測試該語句是否能夠正確運行|运盛娱乐彩票,若不能-|自己人歌词,總能找到幾條簡單的語句進行替代-|_秦皇岛开心订房网。

7.2 Oracle和HBase的性能差異

移植完成後--_我们结婚了泰民停拍,經過一係列debug||山西电视台小郭跑腿,程序總算能夠正常運行了_2019合法买彩票网站。但是性能問題會變得非常嚴重_--大象网直播,這是關係數據庫和HBase之間的設計思路和應用問題域之間的差異造成的_-自行车的污染比汽车更大。
Oracle的設計思路是盡可能的快速對數據進行操作|__霍尔瓦特大街 txt,但是隨著表中記錄數的不斷增加_||行政法规可以设定,查詢性能持續下降||福建少儿频道节目表。要對Oracle進行硬件擴充會比較困難|若禾,而且會在單表一億條左右時(沒有經過本人驗證)碰到性能瓶頸|||评选优秀员工方案。Oracle的優勢是在表中記錄數不多(幾百萬以內_-_众彩彩票平台,具體看服務器性能)時擁有極高的查詢速度|石上藕。
而HBase的優勢是讓單表可以存儲幾乎無限的記錄|众购彩票开奖直播网,並且可以方便的擴充硬件-_小班下学期个人总结,使得查詢速度可以達到一個穩定的標準-_王恒升。但是其缺點在於表中數據不多時_-281彩票,查詢速度相對較慢|_天府新区规划。經測試|--诺基亚5320xm刷机,Phoenix的表在記錄數很少時(數十條)---房室交叉,查詢單條數據也需要0.2秒左右(服務器集群配置見前麵的章節)-尊龙娱乐app官方网站,而同時單服務器的Oracle查詢這樣的數據僅需30ms左右_|360走试图,相差接近十倍|198彩票北京pk的计划员。

7.3 Phoenix索引性能測試

與Oracle相比---盈彩网站首页,Phoenix在性能上還有一個特點就是在沒有索引的情況下||038彩票平台合法吗,查詢性能下降很快苏州海关。
例如下表_|_1216彩票怎么进不去了:

CREATE TABLE IF NOT EXISTS WXB_WORD (ID INTEGER PRIMARY KEY, NAME VARCHAR, VALUE DOUBLE, HEAT INTEGER, FOCUSLEVEL INTEGER, USERID INTEGER);

不建立索引的情況下-|_永盛国际投资靠谱吗?,在前麵介紹的集群上進行查詢性能測試|-错误类型500,查詢語句如下(確保單條命中)-|htcg55:

SELECT * FROM WXB_WORD WHERE NAME=’XXX’;

50萬條記錄||_试卖网,平均單條查詢時間為0.38秒-|有约鞋批发网;
100萬條記錄_静安 大火,平均單條查詢時間為0.79秒|汕尾台风网;
500萬條記錄|娱乐天地在哪里下载,平均單條查詢時間為4.31秒_-|易旺彩票网上海快三;
然而在NAME字段上建立索引後--|阿诗郎,將表中數據增加到1億條-_142857与彩票的联系,平均單條查詢時間為0.164秒__|管栎,可見索引對Phoenix性能的提升作用是無可替代的|姿姿堂。

7.4 Phoenix索引簡介

Phoenix中的索引被稱之為Secondary Indexing(二級索引)-_善淘网首页,這是為了和HBase主鍵上的索引區分開|-|隋唐英雄王世充。在HBase中-_|重生之庶女继妻,每個表有且僅有一個主鍵的索引|_|360彩票购彩大厅,該索引按照字典序進行排序-__金诗麦闪电瘦;所有不基於主鍵的查詢都會導致全表掃描_||微众圈,效率非常低下|-_陆贞传奇下载mp4。在Phoenix中-_觅血者斯基尔,可以對表中的任何一個字段或者幾個字段建立二級索引--靖州红网,該索引實際上是一個獨立的表_|2019香港管家婆马报,表中包含了被索引的列以及建立索引時包含的列(在索引的include語句中包含的列)||多普达t8388微信。當用戶對表進行查詢時|-天兰尾货市场,會首先對索引進行查詢||我的家乡作文600字,若能夠得到全部的結果|||长盛井管,則會直接返回_|网上购物秋装,否則就到原表中進行查詢_-重庆继续教育培训网。
注意--吹情药,Phoenix的每個表都可以建立多個索引_-陈国栋的秘书,索引和原表之間的同步由Phoenix保證_--金天桥。但是|__206 217 214 175,索引越多_-云顶娱乐靠谱吗,寫入效率越低-浦东科普网。
Phoenix支持兩種類型的索引||不思议游戏国语版:可變索引(mutable indexing)和不可變索引(immutable indexing)|_-2013四川地震。在表中數據需要變化時_-金庸2加强版,使用可變索引-_|阿拉酷;當應用場景為“一次寫入-_|云顶娱乐靠谱吗,隻會追加-_|角竹光寿打成语,永不改變”時使用不可變索引|||阿里巴巴小额批发。本文中隻使用了可變索引|-|诺基亚5238刷机。

7.5 建立索引的方法與語句

在建立索引之前||微商怎么找客源xs7031,再次檢查Phoenix的配置-_360彩票超级赛车,在HBase集群的每個服務器的hbase-site.xml配置文件中|--重修之灭仙弑神续集,加入||-qq2009手机版:

<property>
  <name>hbase.regionserver.wal.codec</name>
  <value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
</property>

例如-__365精彩每一天:在WXB_WORD表上對NAME字段建立DESC索引_东北二嫂百度云,該索引還包含了VALUE字段的值(注意_|_银川欧陆经典,Phoenix是大小寫不敏感的)|_|160彩票是真的吗。

create index if not exists idx_wxb_word on wxb_word (name desc) include (value) ;

那麼這種語句就查詢得特別快|__色狗图片:

select name,value from wxb_word where name='AHNHLYPKGYAR_59999';

但是如果查詢語句中還需要知道其他字段的值|嘉祥石雕艺术节,例如-_易旺彩票窍门:

select name,value,userid from wxb_word where name='AHNHLYPKGYAR_59999';

那麼_亿博登录,就和沒有索引差不多-_|lightroom3 6序列号,因為該索引中沒有包含userid這個字段--意彩。
另外需要注意的是|尊彩app:主鍵不需要索引_103彩票平台,查詢也非常快__|注册自助领888体验金,這是由HBASE的特性保證的_其乐船长。
刪除索引語句|u盘修复大师:

drop index if exists idx_wxb_word on wxb_word;

8. 總結

使用Phoenix將SQL代碼移植到HBase應注意以下幾個問題-10元可提现的彩票平台。
第一||_雳剑电视剧 全集36,應用場景是否合適-中华益智养生功?是否需要在單表中存儲幾乎無限的數據__|易点彩票网开机号分析,並保證一定的查詢性能__-苏州干将西路535号?在數據量較少的情景下_-|哈雷摩托官网,Phoenix反而比Oracle的性能差-_|花园宝宝游戏大礼包。若要追求最高的性能--男街霸投掷精通,可以考慮同時使用關係數據庫和HBase_--038彩票,並自己保證這部分數據的同步_-360彩票购彩大厅首页。
第二_许家印专机,Phoenix公安部查封云联惠、HBase__|赛尔号鱼龙王刷什么、Hadoop|-赢彩网是正规平台吗?、ZooKeeper的版本兼容問題_盈彩彩票。在大部分情況下-_|浦东科普网,開發人員並不能決定HBase_-|聚美优品上不去、Hadoop和ZooKeeper的版本_|_11选5能买杀码的平台,因此隻能尋找合適的Phoenix版本來適配它們_-_135彩票网站钱提不出来,這將導致你不能使用最新的Phoenix版本-亿博彩票。如同本文中寫的一樣_197彩票,這種情況會導致一些Phoenix SQL語句的特性得不到支持|-|银色黎明声望怎么刷。
第三__-固始吧,注意Phoenix的每個表必須包含一個主鍵(其實就是HBase的Primary rowkey)__-青岛洗头房,且該主鍵自帶索引||_30码期期必中特141期,合理設計這個主鍵能夠帶來性能上的提升和查詢的便利---鹰彩写真机。作為從SQL時代過來的程序員|-256时时彩安卓版,拋棄節約空間的想法|||cctv10怪兽之谜1;在大數據時代--_大连大商新玛特招聘,就是盡可能的用空間換時間__01彩票官网蓝色版。舉個例子|重庆新任公安局长,你甚至可以將所有字段以一定的順序和分隔符全部堆到主鍵上_-_苏州网上车管所。
第四-|19彩票平台,移植代碼時|娃独自下车被牵走,將所有SQL語句一一翻譯為對應的Phoenix語句即可|-160彩票是真的吗。注意參考Phoenix主頁上的語法介紹_|可可西男装,並一一進行測試--|德州华翔驾校。Phoenix對JDBC的支持很好_-英国梧桐,諸如連接池一類的特性可以原封不動的照搬_|199反水05。但若原來的程序使用了針對SQL語句的中間件之類的技術1号彩票1800yhcom,請恕我也不知如何處理|娃哈哈股票代码。
第五__塞班5800,一定要對Phoenix的表建立二級索引_-|魏征进谏图作者,索引中盡可能包含所有需要查詢的字段_--助赢计划官网。索引會導致數據插入速度變慢||重生之凤求凰,但會帶來巨大的性能提升--|其实不想走简谱。

延伸閱讀||易记彩票可靠吗:

Tag標簽|_2011qq版本: 代碼  
  • 專題推薦

  • Windows7係統入門 優化 技巧技術專題
  • Windows7係統專題 無論是升級操作係統|北京市统计局信息直报网、資料備份_-美国vivid、加強資料的安全及管...... 詳細
About IT165 - 廣告服務 - 隱私聲明 - 版權申明 - 免責條款 - 網站地圖 - 網友投稿 - 聯係方式
本站內容來自於互聯網,僅供用於網絡技術學習,學習中請遵循相關法律法規
88彩票360彩票迪士尼彩票分分彩票快乐赛车秒速时时彩

免责声明: 本站资料及图片来源互联网文章,本网不承担任何由内容信息所引起的争议和法律责任。所有作品版权归原创作者所有,与本站立场无关,如用户分享不慎侵犯了您的权益,请联系我们告知,我们将做删除处理!