phoenix建表映射有命名空间的hbase表

1.先开启schema与namespace的对应关系
在phoenix中与hbase的命名空间相对应的是schema概念,默认是没有开启的,需要在hbase的hbase-site.xml中增加以下配置项

<property>
  <name>phoenix.schema.isNamespaceMappingEnabled</name>
  <value>true</value>
</property>
<property>
  <name>phoenix.schema.mapSystemTablesToNamespace</name>
  <value>true</value>
</property>

如果你是用apache原生框架搭的集群,只能去每台集群的hbase目录下手动修改了,要是搭建的cdh集群,则可以在cloudera manager界面去修改,一般我会把hbase的服务端和客户端都改一下。2.hbase中建有命名空间的表

create_namespace 'binlog'
create 'binlog:student','cf'

put 'binlog:student','1001','info:name','roma'
put 'binlog:student','1001','info:sex','male'
put 'binlog:student','1001','info:age','18'
put 'binlog:student','1002','info:name','xdxh'
put 'binlog:student','1002','info:sex','female'
put 'binlog:student','1002','info:age','20'

scan 'binlog:student'

3.phoenix映射操作:
首先创建与命名空间对应的schema,如果不创建的话,会报错

"Schema does not exist schemaName=binlog (state=43M05,code=722)"
CREATE SCHEMA IF NOT EXISTS "binlog";

映射视图view。视图只是供查询操作,不能修改数据,当删除视图的时候,对hbase中的源表不会有影响

CREATE VIEW "binlog"."student"(
  "ROW" varchar primary key,
  "info"."age" varchar,
  "info"."name" varchar,
  "info"."sex" varchar
)

映射表table,表可以查询及修改数据,当删除表的时候,hbase中的源数据表也会被删除(view无法upsert ,table可以upsert)

CREATE TABLE "binlog"."student"(
  "ROW" varchar primary key,
  "info"."age" varchar,
  "info"."name" varchar,
  "info"."sex" varchar
) column_encoded_bytes=0;  //禁用列映射

映射成功

4.遗留bug
我映射建表的时候所有字段都是varchar类型,也只有全是varchar类型的时候才能映射成功。
hbase中的数据都是二进制的,所以加了类型需要反序列化二进制,
我在官网上查到phoenix映射存在的hbase表部分数字类型和日期类型需要使用unsigned类型,


但当我改为

CREATE TABLE "binlog"."student"(
  "ROW" varchar primary key,
  "info"."age" UNSIGNED_INT,
  "info"."name" varchar,
  "info"."sex" varchar
) column_encoded_bytes=0;

还是会报错:Illegal data. Expected length of at least 58 bytes, but had 32 (state=22000,code=201)
映射失败,查不出数据

这个问题一直没有解决
————————————————
版权声明:本文为CSDN博主「XDSXHDYY」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/XDSXHDYY/article/details/96461576

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HBase是一个分布式、可扩展、面向列的NoSQL数据库系统,它可以在Hadoop集群上运行,并且被广泛应用于大数据处理领域。在HBase中,命名空间(Namespace)是用于组织和管理的一种机制。在命名空间中,可以创建多个,并且这些可以具有相同或不同的列族。 要在HBase命名空间中创建表,首先需要使用HBase的客户端工具连接到HBase集群。然后,可以使用HBase shell或HBase API来执行相应的操作。 在HBase shell中,可以使用以下命令来创建命名空间: 1. 创建命名空间: create_namespace 'namespace_name' 2. 创建表: create 'namespace_name:table_name', 'column_family1', 'column_family2', ... 其中,'namespace_name'是要创建的命名空间的名称,'table_name'是要创建的的名称,'column_family1', 'column_family2'等是的列族。 在HBase API中,可以使用Java编程语言来创建命名空间。以下是一个简单的示例代码: ``` java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.NamespaceDescriptor; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.Admin; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory; import org.apache.hadoop.hbase.client.TableDescriptor; import org.apache.hadoop.hbase.client.TableDescriptorBuilder; public class HBaseNamespaceExample { public static void main(String[] args) throws Exception { Configuration conf = HBaseConfiguration.create(); Connection connection = ConnectionFactory.createConnection(conf); Admin admin = connection.getAdmin(); // 创建命名空间 NamespaceDescriptor namespaceDescriptor = NamespaceDescriptor .create("namespace_name") .build(); admin.createNamespace(namespaceDescriptor); // 创建表 TableDescriptor tableDescriptor = TableDescriptorBuilder .newBuilder(TableName.valueOf("namespace_name", "table_name")) .addColumnFamily(ColumnFamilyDescriptorBuilder.of("column_family1")) .addColumnFamily(ColumnFamilyDescriptorBuilder.of("column_family2")) .build(); admin.createTable(tableDescriptor); admin.close(); connection.close(); } } ``` 通过以上的命令或代码,就可以在HBase命名空间中成功创建表。在创建完成后,可以继续使用HBase的相关功能进行数据的读取、写入和查询等操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值