Hive内置函数大全-06-复杂数据类型函数

454 阅读2分钟

1. 复杂数据类型构造器

1.1 MAP

  • 说明:创建map列,value的类型固定
  • 参数:(key1, value1, key2, value2, ...)
  • 案例
SELECT MAP('name', 'tom', 'age', '20');
+----------------------------+
|            _c0             |
+----------------------------+
| {"name":"tom","age":"20"}  |
+----------------------------+

SELECT MAP('name', 'tom', 'age', 20);
+----------------------------+
|            _c0             |
+----------------------------+
| {"name":"tom","age":"20"}  |
+----------------------------+

SELECT MAP('name', 20, 'age', '20');
+---------------------------+
|            _c0            |
+---------------------------+
| {"name":"20","age":"20"}  |
+---------------------------+

1.2 STRUCT

  • 说明:创建truct列
  • 参数:(val1, val2, val3, ...),struct的字段名固定为col1,col2,col3,...,与map()方法类似,但value的类型可以不同
  • 案例
SELECT STRUCT('Hello', 100);
+------------------------------+
|             _c0              |
+------------------------------+
| {"col1":"Hello","col2":100}  |
+------------------------------+

1.3 NAMED_STRUCT

  • 说明:创建指定字段名称的struct列
  • 参数:(name1, val1, name2, val2, ...),与map()方法类似,但value的类型可以不同
  • 案例
SELECT NAMED_STRUCT('Hello', 100, 'name', 'tom');
+-----------------------------+
|             _c0             |
+-----------------------------+
| {"hello":100,"name":"tom"}  |
+-----------------------------+

1.4 ARRAY

  • 说明:创建数组列
  • 参数:(val1, val2, ...)
  • 案例
SELECT ARRAY(1, 2, 3);
+----------+
|   _c0    |
+----------+
| [1,2,3]  |
+----------+

SELECT ARRAY(1, 2, '3');
+----------------+
|      _c0       |
+----------------+
| ["1","2","3"]  |
+----------------+

2. 查询复杂数据类型中的元素

-- 数组下标中0开始
SELECT arr[0] FROM (SELECT ARRAY(1, 2, 3) AS arr) t;
+------+
| _c0  |
+------+
| 1    |
+------+

-- 查询 map 中的元素
SELECT m['name'] FROM (SELECT MAP('name', 'tom', 'age', '20') AS m) t;
+------+
| _c0  |
+------+
| tom  |
+------+

-- 查询 struct 中的元素

SELECT s.name FROM (SELECT NAMED_STRUCT('Hello', 100, 'name', 'tom') AS s) t;
+-------+
| name  |
+-------+
| tom   |
+-------+

3. 函数

SIZE(Map<K.V>)、SIZE(Array)

  • 定义:size(Map<K.V>) size(Array<T>)
  • 说明:返回数组中元素个数和map中键值对个数
  • 返回值类型:int
  • 案例
SELECT SIZE(arr) FROM (SELECT ARRAY(1, 2, 3) AS arr) t;
+------+
| _c0  |
+------+
| 3    |
+------+

SELECT SIZE(m) FROM (SELECT MAP('name', 'tom', 'age', '20') AS m) t;
+------+
| _c0  |
+------+
| 2    |
+------+

MAP_KEYS(Map<K.V>)

  • 定义:map_keys(Map<K.V>)
  • 说明:获取map中的所有key创建数组
  • 返回值类型:array
  • 案例
SELECT MAP_KEYS(m) FROM (SELECT MAP('name', 'tom', 'age', '20') AS m) t;
+-----------------+
|       _c0       |
+-----------------+
| ["name","age"]  |
+-----------------+

MAP_VALUES(Map<K.V>)

  • 定义:map_values(Map<K.V>)
  • 说明:获取map中的所有value创建数组
  • 返回值类型:array
  • 案例
SELECT MAP_VALUES(m) FROM (SELECT MAP('name', 'tom', 'age', '20') AS m) t;
+---------------+
|      _c0      |
+---------------+
| ["tom","20"]  |
+---------------+

ARRAY_CONTAINS(Array, value)

  • 定义:array_contains(Array<T>, value)
  • 说明:判断一个元素在数组中存在与否
  • 返回值类型:boolean
  • 案例
SELECT ARRAY_CONTAINS(arr, 1) FROM (SELECT ARRAY(1, 2, 3) AS arr) t;
+-------+
|  _c0  |
+-------+
| true  |
+-------+

SELECT ARRAY_CONTAINS(arr, 4) FROM (SELECT ARRAY(1, 2, 3) AS arr) t;
+--------+
|  _c0   |
+--------+
| false  |
+--------+

SORT_ARRAY(Array)

  • 定义:sort_array(Array<T>)
  • 说明:按照数组元素的自然顺序使用升序方式对数组进行排序
  • 返回值类型:array
  • 可用版本:hive-0.9.0+
  • 案例
SELECT SORT_ARRAY(arr) FROM (SELECT ARRAY(3, 2, 1) AS arr) t;
+----------+
|   _c0    |
+----------+
| [1,2,3]  |
+----------+

SELECT SORT_ARRAY(arr) FROM (SELECT ARRAY('1', '2', '11', '13') AS arr) t;
+----------------------+
|         _c0          |
+----------------------+
| ["1","11","13","2"]  |
+----------------------+

CONCAT_WS(STRING sep, ARRAY)

  • 定义:concat_ws(string SEP, array<string>)
  • 说明:将数组中的每个元素拼接成字符串,连接符为sep,数组元素类型必须为STRING,否则会报错
  • 返回值类型:string
  • 案例
SELECT CONCAT_WS("-", ARRAY('1', '2', '3'));
+--------+
|  _c0   |
+--------+
| 1-2-3  |
+--------+