**建表**
<hr/>
```sql
-- customer 表名
-- NAME 列族名,且至少创建一个列族、必须是大写字母
hbase(main):010:0> create 'customer', {NAME=>'addr'}, {NAME=>'order'}
-- 也可以省略NAME
hbase(main):010:0> create 'customer', 'addr', 'order'
```
在hdfs的目录如下:
```
/hbase/data/default/customer/c8e45208523fab04f160da91c24909bb/addr
/hbase/data/default/customer/c8e45208523fab04f160da91c24909bb/order
```
一个列族就是hdfs的一个目录。<br/>
**插入单行数据**
<hr/>
```sql
-- r00001 为rowkey
-- city,state等就是列
-- montreal、ON等就是值
hbase(main):011:0> put 'customer', 'r00001', 'addr:city', 'montreal'
hbase(main):012:0> put 'customer', 'r00001', 'addr:state', 'ON'
hbase(main):013:0> put 'customer', 'r00001', 'order:numb', '123456'
hbase(main):014:0> put 'customer', 'r00001', 'order:date', '2015-12-19'
```
查看对应的hdfs目录是空的
![](https://img.kancloud.cn/5d/d0/5dd0044fee23355b818deaf08aecf075_1465x258.png)
![](https://img.kancloud.cn/5f/91/5f91521f0f0d5b109a1be748d53f09fa_1486x282.png)
这就证明,<mark>HBase 写入数据是没有直接落磁盘的,是先写在缓冲中</mark>。为了方便演示,可以手动刷出缓存,命令为`flush`。
```sql
-- 可以只输入flush查看示例
hbase(main):015:0> flush
hbase> flush 'TABLENAME'
hbase> flush 'REGIONNAME'
hbase> flush 'ENCODED_REGIONNAME'
-- flush customer表,将数据写到磁盘中
hbase(main):016:0> flush 'customer'
```
flush 完成后,可以看到对应的列族目录下,有数据文件了,该文件就是 HFile
![](https://img.kancloud.cn/10/c8/10c8419d82754511c136834bdf7e2909_1478x219.png)
![](https://img.kancloud.cn/61/8f/618fe8e5ff0d7843a2fd47ed34951057_1473x233.png)
列族目录下的文件,可以尝试使用 hdfs 命令查看其内容,会发现是二进制的内容。HBase 提供了查看该文件内容的方式。下面命令在 Linux 命令行执行,不是在 hbase shell 中。
```sql
[root@hadoop101 hbase]# bin/hbase hfile -v -p -f /hbase/data/default/customer/c8e45208523fab04f160da91c24909bb/addr/26972466157c4e06b73b83a57f49b05f
K: r00001/addr:city/1608146319888/Put/vlen=8/seqid=4 V: montreal
K: r00001/addr:state/1608146462198/Put/vlen=2/seqid=5 V: ON
Scanned kv count -> 2
```
<br/>
**插入多行数据**
<hr/>
```sql
hbase(main):017:0> put 'customer', 'r00002', 'addr:city', 'miami'
hbase(main):018:0> put 'customer', 'r00002', 'addr:state', 'FL'
hbase(main):019:0> put 'customer', 'r00003', 'addr:city', 'dallas'
hbase(main):020:0> put 'customer', 'r00004', 'addr:state', 'TX'
hbase(main):021:0> flush 'customer'
```
`flush`一次后重新生成了新的HFile文件
![](https://img.kancloud.cn/e0/bb/e0bb8de7f759543d2459feb98730e153_1484x288.png)
```sql
-- 查看
[root@hadoop101 hbase]# bin/hbase hfile -v -p -f /hbase/data/default/customer/c8e45208523fab04f160da91c24909bb/addr/c076c18ae7e74712aa805584b7a165b5
K: r00002/addr:city/1608148485122/Put/vlen=5/seqid=12 V: miami
K: r00002/addr:state/1608148500312/Put/vlen=2/seqid=13 V: FL
K: r00003/addr:city/1608148511348/Put/vlen=6/seqid=14 V: dallas
K: r00004/addr:state/1608148527251/Put/vlen=2/seqid=15 V: TX
Scanned kv count -> 4
```
<br/>
**上传hdfs文档到hbase表中**
<hr/>
(1)准备的test.csv数据如下图
![](https://img.kancloud.cn/59/80/5980d62fdb1647918a776e3b5420a070_1264x152.png)
```sql
(2)需要将test.csv上传到hdfs
[root@hadoop101 hadoop]# bin/hdfs dfs -put /hbase_datas/test.csv /hbase/data/
(3)创建customer表
hbase(main):008:0> create 'customer', {NAME=>'order'}
(4)将hdfs上的test.csv数据复制到customer表中
-- test.csv共有三列,hbase会选择第一列作为HBASE_ROW_KEY
[root@hadoop101 hbase]# bin/hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.separator="," -Dimporttsv.columns=HBASE_ROW_KEY,order:name,order:number customer /hbase/data/test.csv
(5)查看customer表
hbase(main):021:0> scan 'customer'
ROW COLUMN+CELL
1 column=order:name, timestamp=1608281767284, value=NoFrill
1 column=order:number, timestamp=1608281767284, value=10
2 column=order:name, timestamp=1608281767284, value=Lablaws
2 column=order:number, timestamp=1608281767284, value=23
3 column=order:name, timestamp=1608281767284, value=FoodMart
3 column=order:number, timestamp=1608281767284, value=18
4 column=order:name, timestamp=1608281767284, value=FoodLovers
4 column=order:number, timestamp=1608281767284, value=26
5 column=order:name, timestamp=1608281767284, value=Walmart
5 column=order:number, timestamp=1608281767284, value=30
```
<br/>
**扫描查看表**
<hr/>
```sql
-- 查看整张表
hbase(main):022:0> scan 'customer'
ROW COLUMN+CELL
r00001 column=addr:city, timestamp=1608146319888, value=montreal
r00001 column=addr:state, timestamp=1608146462198, value=ON
r00001 column=order:date, timestamp=1608146484642, value=2015-12-19
r00001 column=order:numb, timestamp=1608146472978, value=123456
r00002 column=addr:city, timestamp=1608148485122, value=miami
r00002 column=addr:state, timestamp=1608148500312, value=FL
r00003 column=addr:city, timestamp=1608148511348, value=dallas
r00004 column=addr:state, timestamp=1608148527251, value=TX
-- 查看指定的列
hbase(main):023:0> scan 'customer', {COLUMNS=>['order:numb'], VERSIONS=>2}
ROW COLUMN+CELL
r00001 column=order:numb, timestamp=1608146472978, value=123456
-- 查看指定范围内的行
hbase(main):026:0> scan 'customer', {STARTROW=>'r00001', STOPROW=>'r00003'}
ROW COLUMN+CELL
r00001 column=addr:city, timestamp=1608146319888, value=montreal
r00001 column=addr:state, timestamp=1608146462198, value=ON
r00001 column=order:date, timestamp=1608146484642, value=2015-12-19
r00001 column=order:numb, timestamp=1608146472978, value=123456
r00002 column=addr:city, timestamp=1608148485122, value=miami
r00002 column=addr:state, timestamp=1608148500312, value=FL
```
<br/>
**查看表结构**
<hr/>
```sql
hbase(main):027:0> desc 'customer'
```
<br/>
**更新指定字段的数据**
```sql
hbase(main):028:0> put 'customer', 'r00001', 'order:numb', '654321'
```
<br/>
**get查看数据**
```sql
-- 查看某一行的数据
hbase(main):031:0> get 'customer', 'r00001'
COLUMN CELL
addr:city timestamp=1608146319888, value=montreal
addr:state timestamp=1608146462198, value=ON
order:date timestamp=1608146484642, value=2015-12-19
order:numb timestamp=1608154475714, value=654321
-- 查看某一行某一列族的数据
hbase(main):032:0> get 'customer', 'r00001','addr'
COLUMN CELL
addr:city timestamp=1608146319888, value=montreal
addr:state timestamp=1608146462198, value=ON
-- 查看某一行某一列族某一列的数据
hbase(main):033:0> get 'customer', 'r00001', 'addr:city'
COLUMN CELL
addr:city timestamp=1608146319888, value=montreal
```
<br/>
**统计一张表共有多少行**
<hr/>
```sql
hbase(main):034:0> count 'customer'
=> 4
```
<br/>
**删除数据**
<hr/>
```sql
-- 删除某个rowkey的数据
hbase(main):035:0> deleteall 'customer', 'r00001'
-- 删除某列的数据
hbase(main):041:0> delete 'customer', 'r00002', 'addr:city'
```
<br/>
**清空表数据**
<hr/>
```sql
-- 要想清空表,需要启用该表,如果表没有被启用,则使用enable命令启用
hbase(main):047:0> enable'customer'
-- 清空表,清空表的顺序为disable,然后是truncate,但disable由hbase自动完成
hbase(main):049:0> truncate 'customer'
```
<br/>
**删除表**
<hr/>
```sql
-- 要删除一个表,需要将该表置为disable状态
hbase(main):051:0> disable 'customer'
-- 删除表
hbase(main):052:0> drop 'customer'
```
<br/>
**变更表版本容量**
<hr/>
```sql
-- 设置customer表最多可以存储5个最新版本的order列族
-- 默认最多只能存储一个版本
hbase(main):082:0> alter 'customer', NAME=>'order', VERSIONS=>5
-- 添加6个order:numb数据
hbase(main):084:0> put 'customer', 'r00005', 'order:numb', '1'
hbase(main):084:0> put 'customer', 'r00005', 'order:numb', '2'
hbase(main):084:0> put 'customer', 'r00005', 'order:numb', '3'
hbase(main):084:0> put 'customer', 'r00005', 'order:numb', '4'
hbase(main):084:0> put 'customer', 'r00005', 'order:numb', '5'
hbase(main):084:0> put 'customer', 'r00005', 'order:numb', '6'
-- 查看,可以看到只保留了最新的5个版本
hbase(main):097:0> get 'customer','r00005',{COLUMN=>'order:numb',VERSIONS=>6}
COLUMN CELL
order:numb timestamp=1608157210804, value=6
order:numb timestamp=1608157203564, value=5
order:numb timestamp=1608157196530, value=4
order:numb timestamp=1608157187598, value=3
order:numb timestamp=1608156987999, value=2
```
**表名重命名**
```sql
(1)禁用表
hbase shell>disable 'tableName'
(2)制作表的快照
hbase shell> snapshot 'tableName', 'tableSnapshot'
(3)克隆快照为新表的名字
hbase shell> clone_snapshot 'tableSnapshot', 'newTableName'
(4)删除快照
hbase shell> delete_snapshot 'tableSnapshot'
(5)删除原来的表
hbase shell> drop 'tableName'
```
- Hadoop
- hadoop是什么?
- Hadoop组成
- hadoop官网
- hadoop安装
- hadoop配置
- 本地运行模式配置
- 伪分布运行模式配置
- 完全分布运行模式配置
- HDFS分布式文件系统
- HDFS架构
- HDFS设计思想
- HDFS组成架构
- HDFS文件块大小
- HDFS优缺点
- HDFS Shell操作
- HDFS JavaAPI
- 基本使用
- HDFS的I/O 流操作
- 在SpringBoot项目中的API
- HDFS读写流程
- HDFS写流程
- HDFS读流程
- NN和SNN关系
- NN和SNN工作机制
- Fsimage和 Edits解析
- checkpoint时间设置
- NameNode故障处理
- 集群安全模式
- DataNode工作机制
- 支持的文件格式
- MapReduce分布式计算模型
- MapReduce是什么?
- MapReduce设计思想
- MapReduce优缺点
- MapReduce基本使用
- MapReduce编程规范
- WordCount案例
- MapReduce任务进程
- Hadoop序列化对象
- 为什么要序列化
- 常用数据序列化类型
- 自定义序列化对象
- MapReduce框架原理
- MapReduce工作流程
- MapReduce核心类
- MapTask工作机制
- Shuffle机制
- Partition分区
- Combiner合并
- ReduceTask工作机制
- OutputFormat
- 使用MapReduce实现SQL Join操作
- Reduce join
- Reduce join 代码实现
- Map join
- Map join 案例实操
- MapReduce 开发总结
- Hadoop 优化
- MapReduce 优化需要考虑的点
- MapReduce 优化方法
- 分布式资源调度框架 Yarn
- Yarn 基本架构
- ResourceManager(RM)
- NodeManager(NM)
- ApplicationMaster
- Container
- 作业提交全过程
- JobHistoryServer 使用
- 资源调度器
- 先进先出调度器(FIFO)
- 容量调度器(Capacity Scheduler)
- 公平调度器(Fair Scheduler)
- Yarn 常用命令
- Zookeeper
- zookeeper是什么?
- zookeeper完全分布式搭建
- Zookeeper特点
- Zookeeper数据结构
- Zookeeper 内部原理
- 选举机制
- stat 信息中字段解释
- 选择机制中的概念
- 选举消息内容
- 监听器原理
- Hadoop 高可用集群搭建
- Zookeeper 应用
- Zookeeper Shell操作
- Zookeeper Java应用
- Hive
- Hive是什么?
- Hive的优缺点
- Hive架构
- Hive元数据存储模式
- 内嵌模式
- 本地模式
- 远程模式
- Hive环境搭建
- 伪分布式环境搭建
- Hive命令工具
- 命令行模式
- 交互模式
- Hive数据类型
- Hive数据结构
- 参数配置方式
- Hive数据库
- 数据库存储位置
- 数据库操作
- 表的创建
- 建表基本语法
- 内部表
- 外部表
- 临时表
- 建表高阶语句
- 表的删除与修改
- 分区表
- 静态分区
- 动态分区
- 分桶表
- 创建分桶表
- 分桶抽样
- Hive视图
- 视图的创建
- 侧视图Lateral View
- Hive数据导入导出
- 导入数据
- 导出数据
- 查询表数据量
- Hive事务
- 事务是什么?
- Hive事务的局限性和特点
- Hive事务的开启和设置
- Hive PLSQL
- Hive高阶查询
- 查询基本语法
- 基本查询
- distinct去重
- where语句
- 列正则表达式
- 虚拟列
- CTE查询
- 嵌套查询
- join语句
- 内连接
- 左连接
- 右连接
- 全连接
- 多表连接
- 笛卡尔积
- left semi join
- group by分组
- having刷选
- union与union all
- 排序
- order by
- sort by
- distribute by
- cluster by
- 聚合运算
- 基本聚合
- 高级聚合
- 窗口函数
- 序列窗口函数
- 聚合窗口函数
- 分析窗口函数
- 窗口函数练习
- 窗口子句
- Hive函数
- Hive函数分类
- 字符串函数
- 类型转换函数
- 数学函数
- 日期函数
- 集合函数
- 条件函数
- 聚合函数
- 表生成函数
- 自定义Hive函数
- 自定义函数分类
- 自定义Hive函数流程
- 添加JAR包的方式
- 自定义临时函数
- 自定义永久函数
- Hive优化
- Hive性能调优工具
- EXPLAIN
- ANALYZE
- Fetch抓取
- 本地模式
- 表的优化
- 小表 join 大表
- 大表 join 大表
- 开启Map Join
- group by
- count(distinct)
- 笛卡尔积
- 行列过滤
- 动态分区调整
- 分区分桶表
- 数据倾斜
- 数据倾斜原因
- 调整Map数
- 调整Reduce数
- 产生数据倾斜的场景
- 并行执行
- 严格模式
- JVM重用
- 推测执行
- 启用CBO
- 启动矢量化
- 使用Tez引擎
- 压缩算法和文件格式
- 文件格式
- 压缩算法
- Zeppelin
- Zeppelin是什么?
- Zeppelin安装
- 配置Hive解释器
- Hbase
- Hbase是什么?
- Hbase环境搭建
- Hbase分布式环境搭建
- Hbase伪分布式环境搭建
- Hbase架构
- Hbase架构组件
- Hbase数据存储结构
- Hbase原理
- Hbase Shell
- 基本操作
- 表操作
- namespace
- Hbase Java Api
- Phoenix集成Hbase
- Phoenix是什么?
- 安装Phoenix
- Phoenix数据类型
- Phoenix Shell
- HBase与Hive集成
- HBase与Hive的对比
- HBase与Hive集成使用
- Hbase与Hive集成原理
- HBase优化
- RowKey设计
- 内存优化
- 基础优化
- Hbase管理
- 权限管理
- Region管理
- Region的自动拆分
- Region的预拆分
- 到底采用哪种拆分策略?
- Region的合并
- HFile的合并
- 为什么要有HFile的合并
- HFile合并方式
- Compaction执行时间
- Compaction相关控制参数
- 演示示例
- Sqoop
- Sqoop是什么?
- Sqoop环境搭建
- RDBMS导入到HDFS
- RDBMS导入到Hive
- RDBMS导入到Hbase
- HDFS导出到RDBMS
- 使用sqoop脚本
- Sqoop常用命令
- Hadoop数据模型
- TextFile
- SequenceFile
- Avro
- Parquet
- RC&ORC
- 文件存储格式比较
- Spark
- Spark是什么?
- Spark优势
- Spark与MapReduce比较
- Spark技术栈
- Spark安装
- Spark Shell
- Spark架构
- Spark编程入口
- 编程入口API
- SparkContext
- SparkSession
- Spark的maven依赖
- Spark RDD编程
- Spark核心数据结构-RDD
- RDD 概念
- RDD 特性
- RDD编程
- RDD编程流程
- pom依赖
- 创建算子
- 转换算子
- 动作算子
- 持久化算子
- RDD 与闭包
- csv/json数据源
- Spark分布式计算原理
- RDD依赖
- RDD转换
- RDD依赖
- DAG工作原理
- Spark Shuffle原理
- Shuffle的作用
- ShuffleManager组件
- Shuffle实践
- RDD持久化
- 缓存机制
- 检查点
- 检查点与缓存的区别
- RDD共享变量
- 广播变量
- 累计器
- RDD分区设计
- 数据倾斜
- 数据倾斜的根本原因
- 定位导致的数据倾斜
- 常见数据倾斜解决方案
- Spark SQL
- SQL on Hadoop
- Spark SQL是什么
- Spark SQL特点
- Spark SQL架构
- Spark SQL运行原理
- Spark SQL编程
- Spark SQL编程入口
- 创建Dataset
- Dataset是什么
- SparkSession创建Dataset
- 样例类创建Dataset
- 创建DataFrame
- DataFrame是什么
- 结构化数据文件创建DataFrame
- RDD创建DataFrame
- Hive表创建DataFrame
- JDBC创建DataFrame
- SparkSession创建
- RDD、DataFrame、Dataset
- 三者对比
- 三者相互转换
- RDD转换为DataFrame
- DataFrame转换为RDD
- DataFrame API
- DataFrame API分类
- Action 操作
- 基础 Dataset 函数
- 强类型转换
- 弱类型转换
- Spark SQL外部数据源
- Parquet文件
- Hive表
- RDBMS表
- JSON/CSV
- Spark SQL函数
- Spark SQL内置函数
- 自定SparkSQL函数
- Spark SQL CLI
- Spark SQL性能优化
- Spark GraphX图形数据分析
- 为什么需要图计算
- 图的概念
- 图的术语
- 图的经典表示法
- Spark Graphix简介
- Graphx核心抽象
- Graphx Scala API
- 核心组件
- 属性图应用示例1
- 属性图应用示例2
- 查看图信息
- 图的算子
- 连通分量
- PageRank算法
- Pregel分布式计算框架
- Flume日志收集
- Flume是什么?
- Flume官方文档
- Flume架构
- Flume安装
- Flume使用过程
- Flume组件
- Flume工作流程
- Flume事务
- Source、Channel、Sink文档
- Source文档
- Channel文档
- Sink文档
- Flume拦截器
- Flume拦截器概念
- 配置拦截器
- 自定义拦截器
- Flume可靠性保证
- 故障转移
- 负载均衡
- 多层代理
- 多路复用
- Kafka
- 消息中间件MQ
- Kafka是什么?
- Kafka安装
- Kafka本地单机部署
- Kafka基本命令使用
- Topic的生产与消费
- 基本命令
- 查看kafka目录
- Kafka架构
- Kafka Topic
- Kafka Producer
- Kafka Consumer
- Kafka Partition
- Kafka Message
- Kafka Broker
- 存储策略
- ZooKeeper在Kafka中的作用
- 副本同步
- 容灾
- 高吞吐
- Leader均衡机制
- Kafka Scala API
- Producer API
- Consumer API
- Kafka优化
- 消费者参数优化
- 生产者参数优化
- Spark Streaming
- 什么是流?
- 批处理和流处理
- Spark Streaming简介
- 流数据处理架构
- 内部工作流程
- StreamingContext组件
- SparkStreaming的编程入口
- WordCount案例
- DStream
- DStream是什么?
- Input DStream与Receivers接收器
- DStream API
- 转换操作
- 输出操作
- 数据源
- 数据源分类
- Socket数据源
- 统计HDFS文件的词频
- 处理状态数据
- SparkStreaming整合SparkSQL
- SparkStreaming整合Flume
- SparkStreaming整合Kafka
- 自定义数据源
- Spark Streaming优化策略
- 优化运行时间
- 优化内存使用
- 数据仓库
- 数据仓库是什么?
- 数据仓库的意义
- 数据仓库和数据库的区别
- OLTP和OLAP的区别
- OLTP的特点
- OLAP的特点
- OLTP与OLAP对比
- 数据仓库架构
- Inmon架构
- Kimball架构
- 混合型架构
- 数据仓库的解决方案
- 数据ETL
- 数据仓库建模流程
- 维度模型
- 星型模式
- 雪花模型
- 星座模型
- 数据ETL处理
- 数仓分层术语
- 数据抽取方式
- CDC抽取方案
- 数据转换
- 常见的ETL工具