1.问题 1:HBase 命名空间的作用及核心特性
- 作用:对 HBase 中的表进行逻辑分组与隔离,实现资源(表、权限等)的统一管理。
- 核心特性:实现多租户隔离,支持不同业务 / 用户的表独立管理,同时便于权限控制、资源配额分配。
问题 2:列族与列的关系及创建表的必选项
- 关系:列族(column family)是列(column qualifier)的逻辑分组,一个列族下可以包含多个动态定义的列;列是列族下的具体字段标识。
- 创建表时必须指定:列族(列可在插入数据时动态添加,无需在表创建阶段指定)。
问题 3:HBase 命令行及集群状态命令
- 进入交互式命令行的命令:
hbase shell - 查看集群状态的命令:
status
2.一、填空题
题目
- 查看 HBase 中所有表的命令是______;
- 查看 HBase 指定表结构的命令是______(写出核心命令即可)。
答案
listdesc(或describe)
解析
- 第 1 题:
list是 HBase Shell 的基础命令,执行后会直接列出当前 HBase 集群中所有已创建的表,无额外参数时默认展示全部表名。 - 第 2 题:
desc '表名'(全称describe '表名')是查看表结构的核心命令,执行后会展示表的列族配置、版本数、TTL(数据过期时间)等关键信息,例如desc 'student'可查看名为 student 的表结构。
二、单选题
题目 1
关于 HBase 列族,下列说法错误的是()A. 列族创建后尽量不要修改,修改成本高B. 列限定符(列)可以动态添加C. 表可以无列族D. 列族是 HBase 的基本存储单元
答案
C
解析
- A(正确):列族的修改会触发 HBase 底层存储文件(HFile)的重构,需要迁移数据或重建表,操作成本极高,因此建议在创建表时提前规划好列族。
- B(正确):HBase 的列(列限定符)无需在创建表时定义,插入数据时可通过
put命令动态指定,例如put 't1', 'r1', 'cf1:col1', 'value'中,col1就是为列族cf1动态添加的列。 - C(错误):列族是 HBase 表的核心组成部分,创建表时必须指定至少一个列族(如
create 't1', 'cf1'),无法创建无列族的空表。 - D(正确):HBase 的存储以列族为单位,同一列族的数据会被存储在同一批 HFile 文件中,列族是 HBase 数据存储和管理的基本单元。
题目 2
下列关于 HBase Shell 命令的说法,错误的是()A. put 用于向表中添加或修改数据B. get 用于查询表中的单行数据C. scan 用于扫描表中的多行数据(范围查询)D. delete 用于删除表中的列族
答案
D
解析
- A(正确):
put是 HBase 写入 / 更新数据的核心命令,语法为put '表名', '行键', '列族:列', '值';若指定的行键 + 列族:列已存在,会直接覆盖原有值。 - B(正确):
get专用于查询单行数据,语法为get '表名', '行键',也可指定列族 / 列缩小查询范围(如get 't1', 'r1', 'cf1')。 - C(正确):
scan用于全表或范围扫描,语法为scan '表名',可通过STARTROW/ENDROW指定行键范围(如scan 't1', {STARTROW => 'r1', ENDROW => 'r3'}),是批量查询的核心命令。 - D(错误):
delete仅用于删除表中的数据(行、列、版本),语法为delete '表名', '行键', '列族:列';删除列族需使用alter命令,语法为alter '表名', {NAME => '列族名', METHOD => 'delete'}。
总结
-
核心 Shell 命令:
list查所有表、desc查表结构、put写数据、get查单行、scan查多行、alter修改表(含删列族)、delete删数据; -
列族关键特性:是 HBase 表的必选组件,创建时必须指定,且尽量避免后期修改;
-
列的灵活性:列限定符可动态添加,无需在表创建阶段预先定义。
-
HBase 过滤器的作用及行键前缀过滤器
- 过滤器作用:在 HBase 查询过程中对数据进行筛选,减少返回的数据集规模,降低网络传输与客户端处理成本,提升查询效率(避免全表扫描后在客户端过滤数据)。
- 行键前缀过滤器:
PrefixFilter,用于筛选出行键以指定前缀开头的数据。
-
ValueFilter 筛选命令对应的 HBase Shell 命令为:
shell
scan 't2', {ROW => 'r2', FILTER => "ValueFilter(=, 'binary:Mike')"}解析:通过
ROW => 'r2'限定行键为 r2,ValueFilter(=, 'binary:Mike')表示筛选单元格值与 "Mike"(以 binary 方式比较)相等的数据。 -
查看分区编码与合并 region 的命令
-
查看分区编码: shell
list_regions '表名'该命令可列出指定表的所有 Region 及其编码(Region 名称中包含编码信息)。
-
合并相邻 Region: shell
merge_region 'region1编码', 'region2编码'注意:需确保两个 Region 为相邻的(属于同一表且键范围连续)。
-
-
向 t1 表插入数据的命令 HBase 中使用
put命令插入数据,每条put对应一个列的赋值,命令如下: -
shell
put 't1', 'rk001', 'cf1:name', '张三' put 't1', 'rk001', 'cf2:score', '95'解析:
put的语法为put '表名', 'rowkey', '列族:列名', '值',需为不同列族下的列分别执行put操作。 -
禁用、删除 t1 及验证的命令按顺序执行:
- 禁用表:
disable 't1'(HBase 删除表前必须先禁用表) - 删除表:
drop 't1' - 验证删除:
list(执行后查看结果中是否包含t1,无则删除成功)
- 禁用表:
-
统计表 t1 总行数的命令 使用
count命令统计行数:shell
count 't1'解析:
count是 HBase Shell 中用于统计指定表总行数的内置命令,适用于数据量不大的场景;若表数据量较大,可添加CACHE参数优化(如count 't1', {CACHE => 1000})。
你需要基于已有 Hive 订单表order_info,完成三个核心操作:创建指定存储路径的按日期分区的外部表、将原表数据导入分区表、统计 10 月每日订单总金额并排序。
2. 完整 Hive SQL 实现
(1)创建按日期分区的外部表order_info_part
sql
-- 创建外部表,指定分区字段和存储路径
CREATE EXTERNAL TABLE IF NOT EXISTS order_info_part (
order_id string, -- 订单ID
user_id string, -- 用户ID
amount double -- 订单金额
)
PARTITIONED BY (order_date string) -- 按订单日期分区,分区字段单独声明
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t' -- 字段分隔符为制表符(匹配原表数据格式)
STORED AS TEXTFILE -- 存储格式为文本文件
LOCATION '/user/hive/warehouse/order_part'; -- 指定外部表存储路径
关键说明:
EXTERNAL:声明为外部表,删除表时仅删除元数据,不删除存储路径下的实际数据;PARTITIONED BY:分区字段order_date需单独定义,不包含在主字段列表中(避免重复);ROW FORMAT:匹配原表数据的制表符分隔格式,保证数据导入时解析正确;LOCATION:指定外部表的根存储路径,Hive 会自动在该路径下按order_date=yyyy-MM-dd创建分区子目录。
(2)将order_info数据导入分区表order_info_part
sql
-- 插入数据到分区表,自动匹配各日期分区
INSERT OVERWRITE TABLE order_info_part
PARTITION (order_date) -- 指定分区字段,无需赋值,由SELECT结果匹配
SELECT
order_id,
user_id,
amount,
order_date -- 最后一列对应分区字段order_date
FROM order_info;
关键说明:
INSERT OVERWRITE:覆盖分区表中已有数据(若首次导入,用INSERT INTO也可);- SELECT 结果的最后一列必须对应分区字段
order_date,Hive 会自动按order_date的值创建 / 填充对应的分区(如order_date=2024-10-01)。
(3)统计 2024 年 10 月每日订单总金额并排序
sql
-- 统计每日总金额,按日期升序
SELECT
order_date,
SUM(amount) AS total_amount -- 计算每日订单总金额,别名更易读
FROM order_info_part
WHERE order_date LIKE '2024-10-%' -- 筛选2024年10月的数据(严谨性处理)
GROUP BY order_date -- 按日期分组统计
ORDER BY order_date ASC; -- 按日期升序排序(ASC可省略,默认升序)
3. 执行结果说明
上述统计 SQL 执行后,输出结果如下(对应示例数据):
| order_date | total_amount | |
|---|---|---|
| 2024-10-01 | 589.7 | (199.9+299.9+89.9) |
| 2024-10-02 | 499.8 | (99.9+399.9) |
| 2024-10-03 | 759.8 | (599.9+159.9) |
4. 关键点总结
- 分区表创建 :外部表需指定
EXTERNAL和LOCATION,分区字段单独通过PARTITIONED BY声明,字段分隔符需匹配数据格式; - 数据导入:分区表插入数据时,SELECT 结果需包含分区字段,Hive 会自动映射到对应分区;
- 统计逻辑 :通过
GROUP BY按日期分组,SUM(amount)计算总金额,WHERE筛选指定月份数据,ORDER BY保证结果有序。
解释一下 Hive 中分区表的概念和作用
除了按日期分区,Hive 还可以按哪些字段进行分区?
如何在 Hive 中查询分区表的数据?