Phoenix踩坑填坑记录

时间:2023-03-09 06:03:31
Phoenix踩坑填坑记录

记录Phoenix开发过程中的填坑记录。

部分原文地址:phoenix 常见问题与总结

Phoenix建表语句

CREATE TABLE IF NOT EXISTS BUS_INFO_GPS_DATA(busno VARCHAR(10) not null,gpsTime VARCHAR(20) not null,linename VARCHAR(30),upordown VARCHAR(2),weidu VARCHAR(20),jingdu VARCHAR(20),CONSTRAINT  PK_BUS_INFO_GPS_DATA PRIMARY KEY (busno,gpsTime)) ;

如果在PRIMARY KEY (busno,gpsTime))主键当中,调换busno和gpsTime的顺序,则Phoenix建表会报错,需调整至字段顺序一致才可。

若PRIMARY KEY (busno,gpsTime)),则其他的字段属性如果设置了not null属性,会报错。

如何添加二级索引

1) 不加排序:Create INDEX 索引名 ON 表名(列名A,列表B***)
2) 加排序:Create INDEX 索引名 ON 表名(列名A DESC,列表B***) 举例如下: create INDEX id_idx on tower_info("tower_id" ASC ,"create_time" DESC ,"system","sub_system")

判断某表是否存在

DatabaseMetaData connMetaData = conn.getMetaData();
String[] type = {"TABLE"};
ResultSet rs = connMetaData.getTables(null, null, null, type);
boolean testFlag = false;
while (rs.next()){
String tt=rs.getString("TABLE_NAME");
if(tt.equals("TEST")){
testFlag = true;
}
String tp=rs.getString("TABLE_TYPE");
System.out.println(" 表的名称 "+tt+" 表的类型 "+tp);
}

判断索引是否存在

DatabaseMetaData connMetaData = conn.getMetaData();
ResultSet index = connMetaData.getIndexInfo(null, null,
“表名”, false, true);
boolean toweridIdxFlag = false;
while (index.next()){
String name=index.getString("INDEX_NAME");
if(name.equals("TOWERID_IDX")){
toweridIdxFlag =true;
}
System.out.println(" 索引的名称 "+name);
}

Date类型日期,条件判断

select * from test where "create_time" >= TO_DATE(TO_CHAR(?,'yyyy-MM-dd HH:mm:ss'))

杂项

a. phoenix 使用rowkey模糊查询效率特别低

b. Phoenix中建立hbase的映射表不只是加载元数据,还会为HBase 中每一条数据增加一空列标识,如果数据量太大,可能导致超时中断。建议先建立好Phoenix映射表,然后加载数据或增加服务端配置,延长服务端超时时间。

c. 异步方式构建索引过程中,出现问题:不识别Phoenix中小写字母表,不知是不是版本低的问题。

d. 创建Phoenix二级索引后,只能通过Phoenix接口加载数据,直接操作hbase无效的,也就是说只能通过jdbc和加载CSV文件方式加载数据。

e. 为已有数据phoenix表补建索引,亦可能导致超时中断。建议建立phoenix-HBase表时即建好索引,再接数据。