文章目录
- 基本概念
- array
- map
- struct
- 使用
- 创建
- 常用函数(主要汇总了和array相关的)
hive支持的集合类型有三种:
- struct
- map
- array
基本概念
array
含义:array数组是一组具有相同类型和名称的变量集合
访问:内部每个元素可以通过下标来访问,下标从0开始。如值为['john',' boysen']
的数组,第二个元素通过数组名[1]
访问
注意:如果元素为字符类型时,mr和presto的显示不一样。例如['john','boysen']
,mr的结果中显示为["john","boysen"]
,presto结果显示为[john,boysen]
,即一个显示的显示出引号,一个不显示引号,但是还是同一个数据,只是显示的方式不一样
可以通过 如下方法创建新的array列
select array(字段1,字段2) from table
注意array要求元素的类型一样,因此由不同类型的字段创建array会涉及类型转化
map
含义:键值对元组集合
访问:通过键值访问。如map('first','john','last','boysen')
,通过字段名['first']
就可以访问值john
struct
含义:与c语言中的struct或者对象类似
访问:通过点
符号访问元素。如某个列的数据类型是struct{first string, last string}
,那么第一个元素可以通过字段名.first
访问。
使用
创建
create table employees (
name string,
salary float,
subordinates array<string>,
deductions map<string,float>,
address struct<street:string, city:string, state:string, zip:int>
)
三种集合类型在创建的时候可以指定对应的数据类型。
常用函数(主要汇总了和array相关的)
返回类型 | 函数签名 | 描述 |
int | size(Map<K.V>)或size(Array< T>) | 返回array或者map的元素个数 |
boolean | array_contains(Array< T>, value) | 判断value是否在array中 |
array< t> | sort_array(Array< T>) | 根据数组元素的自然顺序将输入数组按升序排序并返回它 |
array< K> | map_keys(Map<K.V>) | 返回包含输入映射键的无序数组 |
array< V> | map_values(Map<K.V>) | 返回包含输入映射值的无序数组 |
string | concat_ws(string SEP, array< string>) | 通过制定分隔符将string array中的元素拼接起来 |
array | split(string str, string pat) | 通过制定分隔符将string拆分成array,pat为正则表达式,注意Java中特殊字符正则表达式的转义(如果使用presto引擎,不需要转义) |
array< double> | percentile(BIGINT col, array(p1 [, p2]…))或者percentile_approx(DOUBLE col, array(p1 [, p2]…) [, B]) | 返回百分位值数组,注意percentile和percentile_approx输入的列类型不一样 |
array | collect_set(col) | 返回消除重复元素的一组对象 |
array | collect_list(col) | 返回包含重复项的对象列表 |
T | explode(ARRAY< T> a) | 将数组分解为多行。返回一个具有单列(col)的行集,数组中的每个元素对应一行 |
int,T | posexplode(ARRAY< T> a) | 使用int类型的附加位置列(原始数组中项的位置,从0开始)将数组分解为多行。返回一个包含两列(pos,val)的行集,数组中的每个元素对应一行 |
T1,…,Tn | inline(ARRAY<STRUCTf1:T1,...,fn:Tn> a) | 将结构数组分解为多行。返回一个包含N列的行集(N=结构中顶级元素的数目),数组中每个结构一行 |
hive官方udf说明:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-LogicalOperators