大数据SQL复杂类型备忘录

在大数据引擎(如Hive SQL)中,复杂数据类型(如 `ARRAY`、`MAP`、`STRUCT` 和 `JSON`)的构造和提取是常见操作。以下详细说明其用法:

---

### 一、复杂类型的构造方法
#### 1. **ARRAY(数组)**
- **构造语法**:`ARRAY(element1, element2, ...)`
- 示例:
```sql
SELECT ARRAY('a', 'b', 'c') AS my_array;
-- 输出: ["a","b","c"]
```

#### 2. **MAP(键值对)**
- **构造语法**:`MAP(key1, value1, key2, value2, ...)`
- 示例:
```sql
SELECT MAP('name', 'John', 'age', '25') AS my_map;
-- 输出: {"name":"John","age":"25"}
```

#### 3. **STRUCT(结构体)**
- **构造语法**:`STRUCT(field1, field2, ...)` 或 `NAMED_STRUCT('field1', value1, 'field2', value2, ...)`
- 示例:
```sql
SELECT NAMED_STRUCT('name', 'John', 'age', 25) AS my_struct;
-- 输出: {"name":"John","age":25}
```

#### 4. **JSON(字符串形式存储)**
- 直接通过字符串构造(需用函数解析):
```sql
SELECT '{"name": "John", "age": 25}' AS json_string;
```

---

### 二、从复杂类型中提取数据
#### 1. **提取 ARRAY 元素**
- 通过下标(从0开始)访问:
```sql
SELECT my_array[0] AS first_element FROM table;
```
- 使用 `explode()` 展开数组(每行一个元素):
```sql
SELECT explode(my_array) AS element FROM table;
```

#### 2. **提取 MAP 的值**
- 通过键名访问:
```sql
SELECT my_map['name'] AS name_value FROM table;
```

#### 3. **提取 STRUCT 的字段**
- 通过字段名访问:
```sql
SELECT my_struct.name AS name_field FROM table;
```

#### 4. **解析 JSON 字符串**
- 使用 `get_json_object()` 提取特定路径的值:
```sql
SELECT get_json_object(json_string, '$.name') AS name FROM table;
```
- 使用 `json_tuple()` 提取多个字段(更高效):
```sql
SELECT json_tuple(json_string, 'name', 'age') AS (name, age) FROM table;
```

---

### 三、简化提取的常用技巧
1. **嵌套提取**(例如从数组中的结构体提取字段):
```sql
SELECT my_array[0].name AS first_name FROM table;
```

2. **结合 LATERAL VIEW 处理数组/Map**(展开后关联原表):
```sql
SELECT id, element
FROM table
LATERAL VIEW explode(my_array) exploded_table AS element;
```

3. **使用 `split()` 处理字符串伪数组**(非原生数组时):
```sql
SELECT split('a,b,c', ',')[0] AS first_element; -- 输出 "a"
```

---

### 四、注意事项
1. **类型一致性**:确保构造时元素类型一致(例如 `ARRAY<int>` 只能包含整数)。
2. **JSON 处理**:Hive 原生不支持 JSON 类型,但可通过字符串和函数模拟。
3. **性能优化**:`explode()` 和 `LATERAL VIEW` 可能导致数据膨胀,需谨慎使用。

如果有具体场景或报错,可以提供更多细节进一步分析!

posted @ 2025-12-12 09:06  ---江北  阅读(7)  评论(0)    收藏  举报
TOP