
# HBase SQL查询样例代码说明
#### 功能简介
Phoenix是构建在HBase之上的一个SQL中间层，提供一个客户端可嵌入的JDBC驱动，Phoenix查询引擎将SQL输入转换为一个或多个HBase scan，编译并执行扫描任务以产生一个标准的JDBC结果集。
#### 代码样例
- 客户端"hbase-example/conf/hbase-site.xml"中配置存放查询中间结果的临时目录，如果客户端程序在Linux上执行临时目录就配置Linux上的路径，如果客户端程序在Windows上执行临时目录则配Windows上的路径。
  ```
  <property>
       <name>phoenix.spool.directory</name>
       <value>[1]查询中间结果的临时目录</value>
  </property>
  ```
  
- Java样例：使用JDBC接口访问HBase。
  ```
  public String getURL(Configuration conf) 
            {  
               String phoenix_jdbc = "jdbc:phoenix"; 
               String zkQuorum = conf.get("hbase.zookeeper.quorum");      
               return phoenix_jdbc + ":" + zkQuorum; 
            } 
             
            public void testSQL() 
            { 
               String tableName = "TEST"; 
               // Create table 
               String createTableSQL = "CREATE TABLE IF NOT EXISTS TEST(id integer not null primary key, name varchar, account char(6), birth date)"; 
             
               // Delete table 
               String dropTableSQL = "DROP TABLE TEST"; 
             
               // Insert 
               String upsertSQL = "UPSERT INTO TEST VALUES(1,'John','100000', TO_DATE('1980-01-01','yyyy-MM-dd'))"; 
             
               // Query 
               String querySQL = "SELECT * FROM TEST WHERE id = ?"; 
             
               // Create the Configuration instance 
               Configuration conf = getConfiguration(); 
                
               // Get URL 
               String URL = getURL(conf); 
             
               Connection conn = null; 
               PreparedStatement preStat = null; 
               Statement stat = null; 
               ResultSet result = null; 
             
               try 
               { 
                   // Create Connection 
                   conn = DriverManager.getConnection(URL); 
                   // Create Statement 
                   stat = conn.createStatement(); 
                   // Execute Create SQL 
                   stat.executeUpdate(createTableSQL); 
                   // Execute Update SQL 
                   stat.executeUpdate(upsertSQL); 
                   // Create PrepareStatement 
                   preStat = conn.prepareStatement(querySQL); 
                   // Execute query 
                   preStat.setInt(1,1); 
                   result = preStat.executeQuery(); 
                   // Get result 
                   while (result.next())  
                   { 
                       int id = result.getInt("id"); 
                       String name = result.getString(1); 
                   } 
               }  
               catch (Exception e) 
               { 
                   // handler exception 
               } 
               finally 
               { 
                   if(null != result){ 
                        try { 
                            result.close(); 
                            } catch (Exception e2) { 
                                // handler exception 
                                } 
                        } 
                   if(null != stat){ 
                       try { 
                           stat.close(); 
                        } catch (Exception e2) { 
                            // handler exception 
                        } 
                   } 
                   if(null != conn){ 
                       try { 
                           conn.close(); 
                        } catch (Exception e2) { 
                            // handler exception 
                        } 
                   } 
                } 
            }
  ```
  
 
#### 注意事项
- 需要在"hbase-site.xml"中配置用于存放中间查询结果的临时目录路径，该目录大小限制可查询结果集大小；
- Phoenix实现了大部分java.sql接口，SQL紧跟ANSI SQL标准。
- MRS 1.9.2之后的版本需要按[HBase Phoenix API接口介绍](https://support.huaweicloud.com/devg-mrs/mrs_06_0041.html)中下载和配置开源的phoenix包。
 
