4. 数据库与复杂类型

本章整理原资料中的 Test1 综合练习,题目与答案逐项对应。

4.1 练习题

  1. 创建名为 ecommerce 的数据库,如果已存在则不报错。

  2. 为该数据库添加注释 This is an ecommerce database

  3. 修改数据库属性,增加键值对 owner=analyst

  4. 切换到 ecommerce 数据库,并设置 Hive CLI 显示当前数据库名称。

  5. 假设已存在用户表 dim_users,复杂类型字段如下: | 字段 | 类型 | |-----------|-------------------------------------------------| | tags | array<string> | | profile | map<string,string> | | address | struct<street:string,district:string,zip:int> |

    1. 查询 tags 中包含 VIP 的用户,并显示其第一个标签。
    2. 提取 profile 中的年龄和性别,年龄转换为整数。
    3. 查询用户所在区和邮编,只筛选“朝阳区”或“浦东新区”。

4.2 数据库操作

-- 第 1、2 题:IF NOT EXISTS 避免数据库已存在时报错
CREATE DATABASE IF NOT EXISTS ecommerce
COMMENT 'This is an ecommerce database';

-- 第 3 题:增加数据库属性
ALTER DATABASE ecommerce
SET DBPROPERTIES ('owner' = 'analyst');

-- 第 4 题:切换数据库并让 CLI 提示符显示当前数据库
USE ecommerce;
SET hive.cli.print.current.db = true;

说明:COMMENTCREATE DATABASE 的子句,应放在语句分号之前;DBPROPERTIES 的键和值均使用字符串。

4.3 ARRAY 查询

SELECT user_id,
       tags[0] AS first_tag
FROM dim_users
WHERE array_contains(tags, 'VIP');

array_contains 判断数组是否包含指定值;Hive 数组下标从 0 开始,因此 tags[0] 是第一个标签。

4.4 MAP 查询

SELECT user_id,
       CAST(profile['age'] AS INT) AS age,
       profile['gender'] AS gender
FROM dim_users;

Map 使用 profile['key'] 取值;由于 profile 的值类型是 STRING,年龄需要用 CAST 转成 INT。

4.5 STRUCT 查询

SELECT user_id,
       address.district AS district,
       address.zip AS zip
FROM dim_users
WHERE address.district IN ('朝阳区', '浦东新区');

Struct 使用点号访问成员;IN 用于匹配给定的两个行政区。

4.6 复杂类型速查

类型 访问方式 示例
ARRAY 使用从 0 开始的下标 tags[0]
MAP 使用键名 profile['age']
STRUCT 使用点号访问成员 address.district