4. 数据库与复杂类型
本章整理原资料中的 Test1 综合练习,题目与答案逐项对应。
4.1 练习题
创建名为
ecommerce的数据库,如果已存在则不报错。为该数据库添加注释
This is an ecommerce database。修改数据库属性,增加键值对
owner=analyst。切换到
ecommerce数据库,并设置 Hive CLI 显示当前数据库名称。假设已存在用户表
dim_users,复杂类型字段如下: | 字段 | 类型 | |-----------|-------------------------------------------------| |tags|array<string>| |profile|map<string,string>| |address|struct<street:string,district:string,zip:int>|- 查询
tags中包含VIP的用户,并显示其第一个标签。 - 提取
profile中的年龄和性别,年龄转换为整数。 - 查询用户所在区和邮编,只筛选“朝阳区”或“浦东新区”。
- 查询
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;
说明:COMMENT 是
CREATE 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 |