HIVE 多表关联的顺序

多表关联顺序的问题

当多张表进行关联的时候,既有 LEFT JOIN,又有 JOIN,此时的关联顺序是如何进行的,假设我们有三张表,数据如下:

① 用户信息表

-- 用户信息表
create table if not exists user_temp
(
    user_id string comment '用户ID',
    user_name string comment '用户姓名',
    emp_id string comment '部门ID'
)
comment '客户信息表'
partitioned by (ds string)
stored as orc tblproperties ('orc.compress'='SNAPPY')
;

在这里插入图片描述
② 公司部门表

-- 部门表
create table if not exists emp_temp
(
    emp_id string comment '部门ID',
    emp_name string comment '部门名称'
)
comment '部门信息表'
partitioned by (ds string)
stored as orc tblproperties ('orc.compress'='SNAPPY')
;

在这里插入图片描述

③ 用户订单表

-- 订单表
create table if not exists order_temp
(
    user_id string comment '用户ID',
    order_id string comment '订单ID',
    order_name string comment '订单名称'
)
comment '订单信息表'
partitioned by (ds string)
stored as orc tblproperties ('orc.compress'='SNAPPY')
;

在这里插入图片描述

多表关联的顺序

① 需求描述

展示当前 A、B、D 部门的用户的订单详情,需要包含的字段有:用户ID、用户姓名、部门号、部门名称、用的订单号、订单名称

② 需求分析(只讨论关联顺序,不需要对需求本身过多讨论)

先通过用户表和部门表关联,剔除不存在的部门,此时获取到的用户只有:ABD 部门用户

将上一步结果和订单表做关联,有订单的则关联到订单数据,没订单则关联到的数据为 NULL

SELECT  t1.user_id
       ,t1.user_name
       ,t2.emp_id
       ,t2.emp_name
       ,t3.order_id
       ,t3.order_name
FROM
(
    SELECT  user_id
           ,user_name
           ,emp_id
    FROM user_temp
    WHERE ds = '20220222' 
) t1
JOIN
(
    SELECT  emp_id
           ,emp_name
    FROM emp_temp
    WHERE ds = '20220222' 
) t2
ON t1.emp_id = t2.emp_id
LEFT JOIN
(
    SELECT  user_id
           ,order_id
           ,order_name
    FROM order_temp
    WHERE ds = '20220222' 
) t3
ON t1.user_id = t3.user_id 
;

在这里插入图片描述
③ 多表关联的顺序的结论

HIVE 的关联书序从上到下依次执行,例如三张表 t1、t2、t3 依次关联,则按照关联顺序依次执行

HIVE 会对每个 JOIN 连接对象启动一个 MapReduce 任务,上面的列子首先会启动一个MapReduce 任务对表 t1 和表 t2 进行连接操作,然后会再启动一个 MapReduce 任务将第一个 MapReduce 任务的输出和表 t3 进行连接操作

<think>首先,用户的问题是关于通过Hive外部关联HBase的配置步骤,我需要参考提供的引用来构建清晰的回答。回顾引用内容:-[1]:提到了创建Hive外部映射到HBase的第一步是在HBase中创建,并确保HBase安装正确。-[2]:提到使用Hive创建外关联HBase,用于查询统计。-[3]:展示了在SparkSQL查询Hive外部时出现的问题,解决方法涉及添加JAR包到Spark。-[4]:给出了具体SQL例子创建外部。-[5]:似乎误引用了其他内容,但提到内部和外部的区别。用户需求:了解配置步骤,关键点是Hive外部关联HBase。我的回答需要:-使用中文。-结构清晰,逐步解释。-所有数学达用$...$内联,独立公式用$$...$$。但在这个问题中可能不涉及太数学,除非提到公式。-生成相关问题。-引用添加标识,如[^1]。-确保引用正确。结构化回答:1.**引言**:简要介绍Hive外部关联HBase的用途。2.**步骤详解**:-Step1:确保HBase存在并配置正确。-Step2:在Hive中创建外部。-Step3:关键配置,如SERDE和映射。-Step4:测试查询。3.**注意事项**:常见问题解决,如从[^3]。4.**相关问题**:生成相关问题。从引用提取关键步骤:-Step1:在HBase中创建(引用[^1])。-`hbaseshell`创建,如`create'users:china_mainland','act'`-Step2:在Hive中创建外部(引用[^4]):-例子:`CREATEEXTERNALTABLE...STOREDBY'org.apache.hadoop.hive.hbase.HBaseStorageHandler'...`-Step3:映射配置:-`WITHSERDEPROPERTIES("hbase.columns.mapping"=":key,act:url")`-`TBLPROPERTIES("hbase.table.name"="users:china_mainland")`-注意事项:如果使用SparkSQL,需添加相关JAR包(引用[^3])。完整步骤:1.**前置条件**:确保HBase服务运行正常,HBase已创建。2.**创建Hive外部**:-使用`STOREDBY'org.apache.hadoop.hive.hbase.HBaseStorageHandler'`。-指定列映射(`hbase.columns.mapping`)。-指定HBase名(`hbase.table.name`)。3.**可能的问题**:如Spark兼容性,需添加HBase和Hive相关JAR。添加引用标识:-提到步骤时,末尾加[^1],[^4]等。生成相关问题:-从系统指令:"生成相关问题"。-类似示例:例如,"Hive外部查询性能如何?"或"如何解决Spark查询错误?"最终回答结构:-开头:概述步骤。-逐步指南。-结尾添加相关问题。</think> ### 如何通过 Hive 外部关联 HBase :配置步骤详解 通过 Hive 外部关联 HBase ,可以实现异构数据源的联合查询和数据共享。这种方法允许您使用 Hive 的 SQL 语句直接操作 HBase 数据,而无需移动数据。以下是基于引用内容的完整配置步骤,包括关键细节和注意事项。整个过程分为四个主要步骤:前置检查、在 HBase 中创建、在 Hive 中创建外部、和测试查询。请注意,所有配置项必须严格遵循引用中的建议,否则可能导致兼容性问题。 #### 1. **前置条件:确保环境正确配置** - **验证 HBase 安装和运行状态**: - 确认 HBase 服务已启动:在命令行运行 `hbase shell`,检查是否能正常连接。 - 确保 HDFS 与 Zookeeper 配置正确,因为 HBase 依赖这些服务。如果遇到连接错误,参考集群文档修复网络或配置问题[^1]。 - **验证 Hive 和 HBase 版本兼容性**: - Hive 2.x+ 和 HBase 1.x+ 或 2.x+ 的兼容性较好。使用 `hive --version` 和 `hbase version` 命令检查版本。 - **关键点**:如引用[^3]所述,如果在 Kerberos 安全环境下运行,需确保 hive-site.xml 中的安全配置(如 Kerberos principal)已正确设置。 #### 2. **在 HBase 中创建(前提步骤)** - HBase 关联的基础,需先创建它,Hive 外部才能映射。 - **步骤**: 1. 进入 HBase Shell:运行 `hbase shell`。 2. 创建命名空间和(如引用[^4]例子): ```sql create_namespace 'users' -- 可选,组织名空间 create 'users:china_mainland', 'act' -- 创建 'users:china_mainland',列族为 'act' ``` - 这里 `users:china_mainland` 是名(格式:`<namespace>:<table_name>`),`act` 是列族名。 3. 插入示例数据(可选):例如,`put 'users:china_mainland', 'row1', 'act:url', 'example.com'`。 - **注意事项**:名和列族名需在后续 Hive 配置中一致对应[^4]。如果 HBase 未创建,Hive 将无法关联查询[^1]。 #### 3. **在 Hive 中创建外部(核心步骤)** - 使用 Hive 的 `CREATE EXTERNAL TABLE` 命令映射到 HBase 。这一步定义了结构、映射关系和存储处理器。 - **完整示例(基于引用[^4])**: ```sql -- 创建外部关联到 HBase 'users:china_mainland' CREATE EXTERNAL TABLE china_mainland_acturl( rowkey STRING, -- 对应 HBase Rowkey act_url STRING -- 对应列族 'act' 下的列 'url' ) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' -- 指定存储处理器 WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,act:url") -- 列映射(关键配置) TBLPROPERTIES ("hbase.table.name" = "users:china_mainland"); -- 指定 HBase 名 ``` - **关键配置解析**: - **`STORED BY`**:必须为 `'org.apache.hadoop.hive.hbase.HBaseStorageHandler'`,这是 Hive 处理 HBase 的引擎。 - **`WITH SERDEPROPERTIES`**: - `"hbase.columns.mapping" = ":key,act:url"`:定义列映射。 - `":key"` 映射到 Rowkey 字段(在 Hive 中定义为 `rowkey`)。 - `"act:url"` 示列族 `act` 下的列 `url`(在 Hive 中定义为 `act_url`)。 - 格式规则:列映射顺序必须与 Hive 顺序一致,个列用逗号分隔,例如 `":key, cf1:col1, cf2:col2"`。 - **`TBLPROPERTIES`**: - `"hbase.table.name" = "users:china_mainland"`:指定 HBase 的全名(包括命名空间)。 - 可选属性:例如 `"external.table.purge" = "false"`(确保删除 Hive 不影响 HBase 数据)[^4]。 - **注意事项**: - **Hive 类型**:确保使用 `EXTERNAL TABLE`,而非内部(内部删除会级联删除 HBase 数据)[^5]。 - **权限设置**:在 Kerberos 环境下,需配置访问权限(如 `grant ... to user`)。 - **常见错误**:如映射错误导致查询失败,检查列名是否大小写一致[^4]。 #### 4. **测试查询和常见问题处理** - **测试查询**: - 在 Hive 中运行简单查询:`SELECT * FROM china_mainland_acturl;`。 - 如果数据量大,使用 `LIMIT` 子句避免性能问题。 - **故障排除**: - **SparkSQL 查询问题**(如引用[^3]):如果通过 SparkSQL 查询 Hive 外部,可能遇到 `ClassNotFoundException`。解决方法: - 添加缺失 JAR 到 Spark 的 jars 目录:`hbase-client-<version>.jar`, `hbase-common-<version>.jar`, `hive-hbase-handler-<version>.jar` 等。具体版本需匹配集群环境。 - 重启 Spark 服务。 - **其他问题**: - 数据不一致:确保 HBase 更新后,Hive 元数据刷新(可选:运行 `msck repair table ...`)。 - 性能优化:如果查询慢,检查映射配置是否正确;考虑 HBase 行键设计对查询效率的影响[^2]。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值