数据库问题

1.问题 1:HBase 命名空间的作用及核心特性

  • 作用:对 HBase 中的表进行逻辑分组与隔离,实现资源(表、权限等)的统一管理。
  • 核心特性:实现多租户隔离,支持不同业务 / 用户的表独立管理,同时便于权限控制、资源配额分配。

问题 2:列族与列的关系及创建表的必选项

  • 关系:列族(column family)是列(column qualifier)的逻辑分组,一个列族下可以包含多个动态定义的列;列是列族下的具体字段标识。
  • 创建表时必须指定:列族(列可在插入数据时动态添加,无需在表创建阶段指定)。

问题 3:HBase 命令行及集群状态命令

  • 进入交互式命令行的命令:hbase shell
  • 查看集群状态的命令:status

2.一、填空题

题目

  1. 查看 HBase 中所有表的命令是______;
  2. 查看 HBase 指定表结构的命令是______(写出核心命令即可)。

答案

  1. list
  2. desc(或 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'}

总结

  1. 核心 Shell 命令:list查所有表、desc查表结构、put写数据、get查单行、scan查多行、alter修改表(含删列族)、delete删数据;

  2. 列族关键特性:是 HBase 表的必选组件,创建时必须指定,且尽量避免后期修改;

  3. 列的灵活性:列限定符可动态添加,无需在表创建阶段预先定义。

  4. HBase 过滤器的作用及行键前缀过滤器

    • 过滤器作用:在 HBase 查询过程中对数据进行筛选,减少返回的数据集规模,降低网络传输与客户端处理成本,提升查询效率(避免全表扫描后在客户端过滤数据)。
    • 行键前缀过滤器:PrefixFilter,用于筛选出行键以指定前缀开头的数据。
  5. ValueFilter 筛选命令对应的 HBase Shell 命令为:

    shell

    复制代码
    scan 't2', {ROW => 'r2', FILTER => "ValueFilter(=, 'binary:Mike')"}

    解析:通过ROW => 'r2'限定行键为 r2,ValueFilter(=, 'binary:Mike')表示筛选单元格值与 "Mike"(以 binary 方式比较)相等的数据。

  6. 查看分区编码与合并 region 的命令

    • 查看分区编码: shell

      复制代码
      list_regions '表名'

      该命令可列出指定表的所有 Region 及其编码(Region 名称中包含编码信息)。

    • 合并相邻 Region: shell

      复制代码
      merge_region 'region1编码', 'region2编码'

      注意:需确保两个 Region 为相邻的(属于同一表且键范围连续)。

  7. 向 t1 表插入数据的命令 HBase 中使用put命令插入数据,每条put对应一个列的赋值,命令如下:

  8. shell

    复制代码
    put 't1', 'rk001', 'cf1:name', '张三'
    put 't1', 'rk001', 'cf2:score', '95'

    解析:put的语法为put '表名', 'rowkey', '列族:列名', '值',需为不同列族下的列分别执行put操作。

  9. 禁用、删除 t1 及验证的命令按顺序执行:

    • 禁用表:disable 't1'(HBase 删除表前必须先禁用表)
    • 删除表:drop 't1'
    • 验证删除:list(执行后查看结果中是否包含t1,无则删除成功)
  10. 统计表 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. 关键点总结

  1. 分区表创建 :外部表需指定EXTERNALLOCATION,分区字段单独通过PARTITIONED BY声明,字段分隔符需匹配数据格式;
  2. 数据导入:分区表插入数据时,SELECT 结果需包含分区字段,Hive 会自动映射到对应分区;
  3. 统计逻辑 :通过GROUP BY按日期分组,SUM(amount)计算总金额,WHERE筛选指定月份数据,ORDER BY保证结果有序。

解释一下 Hive 中分区表的概念和作用

除了按日期分区,Hive 还可以按哪些字段进行分区?

如何在 Hive 中查询分区表的数据?

相关推荐
心止水j13 小时前
hive问题
数据仓库·hive·hadoop
心止水j14 小时前
hive桶
数据仓库·hive·hadoop
心止水j14 小时前
hive 分区总结
数据仓库·hive·hadoop
走遍西兰花.jpg14 小时前
在hive中实现拉链表的更新和merge into
数据仓库·hive·hadoop
zgl_2005377915 小时前
ZGLanguage 解析SQL数据血缘 之 提取子查询语句中的源表名
大数据·数据库·数据仓库·hive·hadoop·sql·etl
qq_124987075315 小时前
基于Hadoop的黑龙江旅游景点推荐系统的设计与实现(源码+论文+部署+安装)
大数据·hadoop·分布式·python·信息可视化
laocooon52385788615 小时前
大专Hadoop课程考试方案设计
大数据·hadoop·分布式
是阿威啊15 小时前
【用户行为归因分析项目】- 【企业级项目开发第五站】数据采集并加载到hive表
大数据·数据仓库·hive·hadoop·spark·scala
zhixingheyi_tian16 小时前
Yarn 之 nodemanager.containermanager.container
hadoop