HBase学习笔记(3)—— HBase整合Phoenix

目录

Phoenix Shell 操作

Phoenix JDBC 操作

Phoenix 二级索引

HBase整合Phoenix

Phoenix 简介

Phoenix 是 HBase 的开源 SQL 皮肤。可以使用标准 JDBC API 代替 HBase 客户端 API来创建表,插入数据和查询 HBase 数据

使用Phoenix的优点

  1. 在 Client 和 HBase 之间放一个 Phoenix 中间层不会减慢速度
  2. Phoenix 对于用户输入的 SQL 有大量的优化手段

Phoenix 安装部署

1.下载并解压

官网地址:Overview | Apache Phoenix

下载地址:Phoenix Downloads | Apache Phoenix

下载好tar包之后上传到服务器上,使用 tar -zxvf进行解压即可

2.server包配置

进入安装phoenix的路径下:cd /opt/module/phoenix

找到server包:

将其复制到hbase安装路径下的lib文件夹中,并同步到其余所有节点上;

3.配置环境变量

vim /etc/profile.d/my_env.sh(自定义的环境变量文件)

添加以下内容:

#phoenix
export PHOENIX_HOME=/opt/module/phoenix
export PHOENIX_CLASSPATH=$PHOENIX_HOME
export PATH=$PATH:$PHOENIX_HOME/bin

4.启动phoenix

首先需要重启hbase;

然后启动phoenix:

/opt/module/phoenix/bin/sqlline.py hadoop102,hadoop103,hadoop104:2181

出现以下界面说明启动成功:

如果出现以下错误:

警告: Failed to load history
java.lang.IllegalArgumentException: Bad history file syntax! 

说明之前之前使用过phoenix,存在历史记录,删除/home/用户名路径下的.sqlline文件夹即可;

我的路径就是:/home/why/.sqlline

Phoenix Shell 操作

使用语法可以查看官网:Grammar | Apache Phoenix

1.table

显示所有表

!table!tables

创建表

指定单个列作为RowKey:

CREATE TABLE IF NOT EXISTS student( 
  id VARCHAR primary key, 
  name VARCHAR, 
  age BIGINT, 
  addr VARCHAR);

在 phoenix 中,表名等会自动转换为大写,若要小写,使用双引号,如"us_population"。

指定多个列的联合作为 RowKey:

CREATE TABLE IF NOT EXISTS student1 (
id VARCHAR NOT NULL,
name VARCHAR NOT NULL,
age BIGINT,
addr VARCHAR
CONSTRAINT my_pk PRIMARY KEY (id, name));

注:Phoenix 中建表,会在 HBase 中创建一张对应的表。为了减少数据对磁盘空间的占用,Phoenix 默认会对 HBase 中的列名做编码处理。具体规则可参考官网链接:

Storage Formats | Apache Phoenix

若不想对列名编码,可在建表语句末尾加上 COLUMN_ENCODED_BYTES = 0;

插入数据
upsert into student values('1001','zhangsan', 10, 'beijing');
查询数据
select * from student;
select * from student where id='1001';
删除数据
delete from student where id='1001';
删除表
drop table student;
退出命令行

!quit

2.表的映射

默认情况下, HBase 中已存在的表,通过 Phoenix 是不可见的。如果要在 Phoenix 中操作 HBase 中已存在的表,可以在 Phoenix 中进行表的映射。映射方式有两种:视图映射和表映射

创建hbase表

在hbase shell中创建表test:create 'test','info1','info2'

视图映射

在phoenix中创建test的视图映射:

create view "test"(id varchar primary key,"info1"."name" varchar, "info2"."address" varchar);

注意:Phoenix 创建的视图是只读的,所以只能用来做查询,无法通过视图对数据进行修改等操作

在表中插入两条数据:

put 'test','10001','info1:name','why'
put 'test','10001','info2:address','10086'

在phoenix中查询:

select * from "test"

注意:这里的test一定要加双引号,否则会将其识别为表而不是视图;

查询结果如下:


如何删除视图:

drop view "test";

视图的删除不会对hbase中的表造成任何影响,在删除视图后依旧能在hbase中查询到表中的数据:

表映射
create table"test"(id varchar primary key,"info1"."name" varchar, "info2"."address" varchar) column_encoded_bytes=0;

进行表映射时,不能使用列名编码,需将 column_encoded_bytes 设为 0

在 Pheonix 创建表去映射 HBase 中已经存在的表,是可以修改删除 HBase 中已经存在的数据的。而且,删除 Phoenix 中的表,那么 HBase 中被映射的表也会被删除

首先查询表中的数据:

然后删除表映射:

drop table "test";

再去hbase中查询就会发现原表也被删除了:

3.数字类型说明

HBase 中的数字,底层存储为补码,而 Phoenix 中的数字,底层存储为在补码的基础上,将符号位反转。故当在 Phoenix 中建表去映射 HBase 中已存在的表,当 HBase 中有数字类型的字段时,会出现解析错误的现象

测试

在hbase中创建表,插入数据并扫描:

create 'test_number','info'
put 'test_number','1001','info:number',Bytes.toBytes(1000)
scan 'test_number',{COLUMNS => 'info:number:toLong'}

结果如下:

toLong的作用是将bytes转化为long类型的数据

否则扫描出来的数据格式就是这样的:

在phoenix中创建表映射:

create view "test_number"(id varchar primary key,"info"."number" bigint);

查询后发现结果有问题:

解决方法

1.使用无符号类型:

Phoenix 种提供了 unsigned_int,unsigned_long 等无符号类型,其对数字的编码解码方式和 HBase 是相同的,如果无需考虑负数,那在 Phoenix 中建表时采用无符号类型是最合适的选择

重新创建视图映射并查询:

create view "test_number"(id varchar primary key,"info"."number" unsigned_long);
select * from "test_number";

结果如下:

2.自定义函数:
如需考虑负数的情况,则可通过 Phoenix 自定义函数,将数字类型的最高位,即符号位反转即可

Phoenix JDBC 操作

添加依赖:

<dependency>
  <groupId>org.apache.phoenix</groupId>
  <artifactId>phoenix-client-hbase-2.4</artifactId>
  <version>5.1.2</version>
</dependency>

编写标准的jdbc代码:

public static void main(String[] args) throws SQLException {
    //创建连接
    String url = "jdbc:phoenix:hadoop102,hadoop103,hadoop104:2181";
    //创建配置
    Properties properties = new Properties();
    //获取连接
    Connection connection = DriverManager.getConnection(url, properties);
    //编译sql语句
    PreparedStatement preparedStatement = connection.prepareStatement("select * from student");
    //执行语句
    ResultSet resultSet = preparedStatement.executeQuery();
    //输出结果
    while (resultSet.next())
    {
        System.out.println(resultSet.getString(1) + ":" + resultSet.getString(2) + ":" + resultSet.getString(3));
    }

    connection.close();
    //由于 Phoenix 框架内部需要获取一个 HBase 连接,所以会延迟关闭
    System.out.println("hello");
}

Phoenix 二级索引

添加如下配置到 HBase 的 HRegionserver 节点的 hbase-site.xml:

<!-- phoenix regionserver 配置参数-->
<property>
  <name>hbase.regionserver.wal.codec</name>
  <value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
</property>

全局索引(global index)

Global Index 是默认的索引格式,创建全局索引时,会在 HBase 中建立一张新表。也就是说索引数据和数据表是存放在不同的表中的,因此全局索引适用于多读少写的业务场景

写数据的时候会消耗大量开销,因为索引表也要更新,而索引表是分布在不同的数据节点上的,跨节点的数据传输带来了较大的性能消耗;在读数据的时候 Phoenix 会选择索引表来降低查询消耗的时间

语法:

  • 创建索引:CREATE INDEX my_index ON my_table (my_col);
  • 删除索引:DROP INDEX my_index ON my_table

示例:给age列添加索引

create index my_index on student(age); 
查看二级索引是否有效

通过explain语法进行查看:

explain select age from student where age = 10;

添加二级索引之后会变成范围扫描;

但如果查询的字段不是索引字段,将会变成全局扫描:

explain select id,name,addr from student where age = 10;

包含索引(covered index)

创建携带其他字段的全局索引(本质还是全局索引

语法:CREATE INDEX my_index ON my_table (v1) INCLUDE (v2);

示例:给age列添加索引,并包含addr列

create index my_index on student(age) include (addr);

查看执行计划:

本地索引(local index)

Local Index 适用于写操作频繁的场景。

索引数据和数据表的数据是存放在同一张表中(且是同一个 Region),避免了在写操作的时候往不同服务器的索引表中写索引带来的额外开销

语法:CREATE LOCAL INDEX my_index ON my_table(my_column);

创建本地索引:

CREATE LOCAL INDEX my_index ON student(age,addr);

查看执行计划:

explain select id,name,addr from student where age = 10;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/146396.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

leetcode:138. 随机链表的复制

一、题目&#xff1a; 138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09; 函数原型&#xff1a; struct Node* copyRandomList(struct Node* head) 二、思路 本题是给出一个单链表&#xff0c;单链表的每个结点还额外有一个随机指针&#xff0c;随机指向其他结点&am…

使用VSCode进行Python模块调试

使用VSCode进行Python模块调试 创建测试文件 创建文件test/a/b.py&#xff0c;且当前工作路径为test/ b.py文件内容&#xff1a; def cal(numa, numb):print(int(numa) int(numb))if __name__ "__main__":import sys# 判断系统参数长度是否为4且判断第2个参数是…

【机器学习基础】机器学习的模型评估(评估方法及性能度量原理及主要公式)

&#x1f680;个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; &#x1f4a1;专栏&#xff1a;机器学习 欢迎订阅&#xff01;后面的内容会越来越有意思~ &#x1f4a1;往期推荐&#xff1a; 【机器学习基础】机器学习入门&#xff08;1&#xff09; 【机器学习基…

【广州华锐互动】VR居家防火逃生模拟演练增强训练的真实性

VR软件开发公司广州华锐互动在消防培训领域已开发了多款VR产品&#xff0c;今天为大家介绍VR居家防火逃生模拟演练系统&#xff0c;这是一种基于虚拟现实技术的消防教育训练设备&#xff0c;通过模拟真实的火灾场景&#xff0c;让使用者身临其境地体验火灾逃生过程&#xff0c;…

Telnet 测试 UDP 端口?

Telnet 并不支持 UDP 端口的测试&#xff0c;可以使用 nc 命令来进行测试。nc 命令两种都支持&#xff1a; TCP # nc -z -v -u [hostname/IP address] [port number] # nc -z -v 192.168.10.12 22 Connection to 192.118.20.95 22 port [tcp/ssh] succeeded! UDP # nc -z -v…

假如我是Langchain专家,你会问什么来测试我的水平

推荐Langchain YouTube 视频排行榜 1. 假如我是Langchain专家&#xff0c;你会问什么来测试我的水平&#xff1b; 作为Langchain专家&#xff0c;您可能需要回答一系列深入和具体的问题&#xff0c;这些问题旨在测试您对Langchain的理解和实际应用能力。以下是一些可能的问题…

浅谈:Flutter现状、与为什么选择Flutter——其实大家都在用只是你不知道罢了

浅谈&#xff1a;谁将会动那些抵制学习还装懂的人的蛋糕 开发环境现状与为什么选择Flutter 我本从不屑于写这种技术外的技术文章&#xff0c;但是今天刷某应用优点上头&#xff0c;想发唯一一篇。这篇文章可能会得罪一些就喜欢地址学新架构的&#xff0c;以及还不了解就开始起哄…

【go】报错整理与解决

文章目录 依赖下载失败checksum mismatch启动报错missing go.sum 依赖下载失败checksum mismatch > go get github.com/hibiken/asynqmon go: downloading github.com/hibiken/asynqmon v0.7.2 go: github.com/hibiken/asynqmonv0.7.2: verifying module: checksum mismatc…

Q learning算法

Q learning算法 代码仓库:https://github.com/daiyizheng/DL/tree/master/09-rl Q Learning是强化学习算法中的一个经典算法。在一个决策过程中&#xff0c;我们不知道完整的计算模型&#xff0c;所以需要我们去不停的尝试。 算法流程 整体流程如下&#xff1a; Q-table 初…

XUbuntu22.04之安装pkg-config(一百九十二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

自定义GPT已经出现,并将影响人工智能的一切,做好被挑战的准备了吗?

原创 | 文 BFT机器人 OpenAI凭借最新突破&#xff1a;定制GPT站在创新的最前沿。预示着个性化数字协助的新时代到来&#xff0c;ChatGPT以前所未有的精度来满足个人需求和专业需求。 从本质上讲&#xff0c;自定义GPT是之前的ChatGPT的高度专业化版本或代理&#xff0c;但自定…

kafka单节点创建 topic 超时

1.根据之前的知道&#xff0c;安装kafka的时候改了config的server.properies文件中的listeners配置 之前这一行是没有注释掉的&#xff0c;结果创建topic的时候时钟报错连接超时 结果资料&#xff0c;发现就是因为listeners的问题 https://blog.csdn.net/weixin_42133361/art…

【2013年数据结构真题】

highlight: a11y-dark 41题 王道解析&#xff1a; 算法的策略是从前向后扫描数组元素&#xff0c;标记出一个可能成为主元素的元素Num 。然后重新计数&#xff0c;确认Num是否是主元素。算法可分为以下两步&#xff1a; 选取候选的主元素&#xff1a;依次扫描所给数组中的每个…

CCNA课程实验-14-Final_Lab

目录 实验条件网络拓朴需求 配置实现1. 配置PC1~3, DHCP_Server的vlan2. VLAN10、20的网关为MSW1对应的SVI&#xff0c;VLAN30、40的网关为MSW2对应的SVI&#xff1b;3. 配置5台交换机之间线路均为Trunk4. 配置5台交换机均启用Rapid-PVST(RSTP)5. 配置DHCP Server&#xff0c;创…

CCF ChinaSoft 2023 论坛巡礼|自动驾驶仿真测试论坛

2023年CCF中国软件大会&#xff08;CCF ChinaSoft 2023&#xff09;由CCF主办&#xff0c;CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办&#xff0c;将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…

Outlook如何精准搜索邮件

说明&#xff1a; 使用Outlook默认的搜索时&#xff0c;会出来很多无关的信息&#xff0c;对搜索邮件带来很大的不便&#xff0c;下面介绍一个使用精准搜索的方法。 操作指引&#xff1a; 1、在outlook左上角&#xff0c;进行如下操作&#xff0c;打开“其他命令” 2、打开快…

基于RFbeam的V-LD1-60GHz毫米波雷达传感器数据获取(通过UART串口来控制模块)

基于RFbeam的V-LD1-60GHz毫米波雷达传感器数据获取&#xff08;通过UART串口来控制模块&#xff09; 文章目录 V-LD1命令发送消息回复通信示例雷达数据获取宏定义通信代码运行效果附录&#xff1a;压缩字符串、大小端格式转换压缩字符串浮点数压缩Packed-ASCII字符串 大小端转…

大数据知识图谱项目——基于知识图谱的电影问答系统(超详细讲解及源码)

大数据知识图谱项目——基于知识图谱的电影问答系统&#xff08;超详细讲解及源码&#xff09; 一、项目概述 知识图谱是将知识连接起来形成的一个网络。由节点和边组成&#xff0c;节点是实体&#xff0c;边是两个实体的关系&#xff0c;节点和边都可以有属性。知识图谱除了…

【物联网】BDS/GNSS 全星座定位导航模块——ATGM332D-5N

随着科技的不断进步&#xff0c;导航系统已经成为我们日常生活中不可或缺的一部分。传统的导航系统往往只提供基本的地图和路线规划&#xff0c;对于一些特殊需求或个性化定位并不够满足。全星座定位导航模块的出现&#xff0c;为我们带来了全新的导航体验。通过结合星座学说和…

【Liunx】部署WEB服务:Apache

【Liunx】部署WEB服务:Apache 概述Apache1.介绍2.Apache文件路径3.Apache详解(1)安装Apache(2)启动Apache(3)配置文件a.Apache主配置文件&#xff1a;vim /etc/httpd/conf/httpd.conf信息&#xff1a;b.基于主机头的虚拟主机 (4)开始演示&#xff1a;a.新建两个网站根目录b.分别…