概述
GP可以通过pxf协议上的hbase外表功能, 在数据库中创建外部表,映射hbase table,以直接在gp中访问 hbase数据,方便将hbase的查询结果集保留在gp中
hbase端准备
HBase基础概念:
•HBase 列包含两个组件:列簇和列限定词。 这些组件由冒号 : 分隔, :
•HBase 行由一个行键和一个或多个列值组成。 行键是表行的唯一标识符
•HBase 表是由具有一个或多个列的数据行组成的多维映射。 创建HBase表时,可以指定一组完整的列簇
•HBase 单元由行(列簇, 列限定词, 列值)和时间戳组成。 给定单元格中的列值和时间戳表示该值的版本
示例: 创建一个HBase表
1.在 default 命名空间中创建一个名为 order_info 的HBase表。 order_info 具有两个列簇: product 和 shipping_info:
hbase(main):> create 'order_info', 'product', 'shipping_info'
2.order_info product 列簇具有名为 name 和 location 的列标识符。shipping_info 列簇具有名为 state 和 zipcode 的列标识符。 将一些数据添加到 order_info 表中:
put 'order_info', '1', 'product:name', 'tennis racquet'
put 'order_info', '1', 'product:location', 'out of stock'
put 'order_info', '1', 'shipping_info:state', 'CA'
put 'order_info', '1', 'shipping_info:zipcode', '12345'
put 'order_info', '2', 'product:name', 'soccer ball'
put 'order_info', '2', 'product:location', 'on floor'
put 'order_info', '2', 'shipping_info:state', 'CO'
put 'order_info', '2', 'shipping_info:zipcode', '56789'
put 'order_info', '3', 'product:name', 'snorkel set'
put 'order_info', '3', 'product:location', 'warehouse'
put 'order_info', '3', 'shipping_info:state', 'OH'
put 'order_info', '3', 'shipping_info:zipcode', '34567'
在本主题后面的示例中,您将通过PXF直接访问 orders_info HBase 表。
3.显示 order_info 表的内容:
hbase(main):006:0> scan 'order_info'
ROW COLUMN+CELL
1 column=product:location, timestamp=1711619646590, value=out of stock
1 column=product:name, timestamp=1711619646553, value=tennis racquet
1 column=shipping_info:state, timestamp=1711619646608, value=CA
1 column=shipping_info:zipcode, timestamp=1711619646624, value=12345
2 column=product:location, timestamp=1711619646653, value=on floor
2 column=product:name, timestamp=1711619646639, value=soccer ball
2 column=shipping_info:state, timestamp=1711619646667, value=CO
2 column=shipping_info:zipcode, timestamp=1711619646680, value=56789
3 column=product:location, timestamp=1711619646710, value=warehouse
3 column=product:name, timestamp=1711619646696, value=snorkel set
3 column=shipping_info:state, timestamp=1711619646730, value=OH
3 column=shipping_info:zipcode, timestamp=1711619625228, value=34567
3 row(s) in 0.0980 seconds
创建外表
- 创建语法:
CREATE EXTERNAL TABLE <table_name>
( <column_name> <data_type> [, ...] | LIKE <other_table> )
LOCATION ('pxf://<hbase-table-name>?PROFILE=HBase')
FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import');
<hbase‑table‑name> HBase表的名称
PROFILE PROFILE 关键字必须指定为 HBase
SERVER=<server_name> PXF用于访问数据的命名服务器配置。可选的; 如果未指定,PXF将使用default服务器。
FORMAT FORMAT 子句必须指定为 ‘CUSTOM’ (FORMATTER=‘pxfwritable_import’)
-
数据类型映射:
HBase是基于字节的; 它将所有数据类型存储为字节数组。 要在Greenplum数据库中表示HBase数据,请为Greenplum数据库列选择与HBase列标识符值的底层内容匹配的数据类型。
注意: PXF不支持复杂HBase对象 -
查询测试
创建外表
CREATE EXTERNAL TABLE orderinfo_hbase ("recordkey" text,"product:name" varchar, "shipping_info:zipcode" int,"product:location" text,"shipping_info:state" int) LOCATION ('pxf://order_info?PROFILE=HBase') FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import');
查询
postgres=# select * from orderinfo_hbase_gwtest;
recordkey | product:name | shipping_info:zipcode
-----------+----------------+-----------------------
1 | tennis racquet | 12345
2 | soccer ball | 56789
3 | snorkel set | 34567
(3 rows)
取全部字段:注意字段与hbase映射字段之间的字段类型关系:
postgres=# CREATE EXTERNAL TABLE gwtest02 ("recordkey" text,"product:name" varchar, "shipping_info:zipcode" text,"product:location" text,"shipping_info:state" text) LOCATION ('pxf://o
CREATE EXTERNAL TABLE
postgres=# select * from gwtest02;
recordkey | product:name | shipping_info:zipcode | product:location | shipping_info:state
-----------+----------------+-----------------------+------------------+---------------------
1 | tennis racquet | 12345 | out of stock | CA
2 | soccer ball | 56789 | on floor | CO
3 | snorkel set | 34567 | warehouse | OH