hive array、map、struct使用

本文详细介绍了Hive中的复合数据类型,包括Structs、Arrays和Maps的使用方法。通过具体的建表实例、数据导入及查询操作展示了这些类型的具体应用,并提供了一些基本的配置参数说明。

hive提供了复合数据类型:
Structs: structs内部的数据可以通过DOT(.)来存取,例如,表中一列c的类型为STRUCT{a INT; b INT},我们可以通过c.a来访问域a
Maps(K-V对):访问指定域可以通过["指定域名称"]进行,例如,一个Map M包含了一个group-》gid的kv对,gid的值可以通过M['group']来获取
Arrays:array中的数据为相同类型,例如,假如array A中元素['a','b','c'],则A[1]的值为'b'

Struct使用

建表:

[plain]  view plain copy
 
  1. hive> create table student_test(id INT, info struct<name:STRING, age:INT>)  
  2.     > ROW FORMAT DELIMITED FIELDS TERMINATED BY ','                         
  3.     > COLLECTION ITEMS TERMINATED BY ':';                                   
  4. OK  
  5. Time taken: 0.446 seconds  

'FIELDS TERMINATED BY' :字段与字段之间的分隔符
''COLLECTION ITEMS TERMINATED BY' :一个字段各个item的分隔符 
导入数据:

[plain]  view plain copy
 
  1. $ cat test5.txt   
  2. 1,zhou:30  
  3. 2,yan:30  
  4. 3,chen:20  
  5. 4,li:80  
  6. hive> LOAD DATA LOCAL INPATH '/home/work/data/test5.txt' INTO TABLE student_test;  
  7. Copying data from file:/home/work/data/test5.txt  
  8. Copying file: file:/home/work/data/test5.txt  
  9. Loading data to table default.student_test  
  10. OK  
  11. Time taken: 0.35 seconds  

查询:

[plain]  view plain copy
 
  1. hive> select info.age from student_test;  
  2. Total MapReduce jobs = 1  
  3. ......  
  4. Total MapReduce CPU Time Spent: 490 msec  
  5. OK  
  6. 30  
  7. 30  
  8. 20  
  9. 80  
  10. Time taken: 21.677 seconds  


Array使用
建表:

[plain]  view plain copy
 
  1. hive> create table class_test(name string, student_id_list array<INT>)  
  2.     > ROW FORMAT DELIMITED                                              
  3.     > FIELDS TERMINATED BY ','                                          
  4.     > COLLECTION ITEMS TERMINATED BY ':';                               
  5. OK  
  6. Time taken: 0.099 seconds  

导入数据:

[plain]  view plain copy
 
  1. $ cat test6.txt   
  2. 034,1:2:3:4  
  3. 035,5:6  
  4. 036,7:8:9:10  
  5. hive>  LOAD DATA LOCAL INPATH '/home/work/data/test6.txt' INTO TABLE class_test ;  
  6. Copying data from file:/home/work/data/test6.txt  
  7. Copying file: file:/home/work/data/test6.txt  
  8. Loading data to table default.class_test  
  9. OK  
  10. Time taken: 0.198 seconds  

查询:

[plain]  view plain copy
 
  1. hive> select student_id_list[3] from class_test;  
  2. Total MapReduce jobs = 1  
  3. ......  
  4. Total MapReduce CPU Time Spent: 480 msec  
  5. OK  
  6. 4  
  7. NULL  
  8. 10  
  9. Time taken: 21.574 seconds  


Map使用
建表:

[plain]  view plain copy
 
  1. hive> create table employee(id string, perf map<string, int>)       
  2.     > ROW FORMAT DELIMITED                                          
  3.     > FIELDS TERMINATED BY '\t'                                
  4.     > COLLECTION ITEMS TERMINATED BY ','                       
  5.     > MAP KEYS TERMINATED BY ':';                                    
  6. OK  
  7. Time taken: 0.144 seconds  

‘MAP KEYS TERMINATED BY’ :key value分隔符

导入数据:

[plain]  view plain copy
 
  1. $ cat test7.txt   
  2. 1       job:80,team:60,person:70  
  3. 2       job:60,team:80  
  4. 3       job:90,team:70,person:100  
  5. hive>  LOAD DATA LOCAL INPATH '/home/work/data/test7.txt' INTO TABLE employee;  

查询:

[plain]  view plain copy
 
  1. hive> select perf['person'] from employee;  
  2. Total MapReduce jobs = 1  
  3. ......  
  4. Total MapReduce CPU Time Spent: 460 msec  
  5. OK  
  6. 70  
  7. NULL  
  8. 100  
  9. Time taken: 20.902 seconds  
  10. hive> select perf['person'] from employee where perf['person'] is not null;     
  11. Total MapReduce jobs = 1  
  12. .......  
  13. Total MapReduce CPU Time Spent: 610 msec  
  14. OK  
  15. 70  
  16. 100  
  17. Time taken: 21.989 seconds  
  18. hive>   
  19. <span style="font-family:Arial, Helvetica, sans-serif;"><span style="white-space: normal;">  
  20. </span></span>  

 

本文转自:http://blog.youkuaiyun.com/yfkiss/article/details/7842014

<think>首先,用户的问题是:“我想查找Hivemaparraystruct函数的使用实例 请问Hive maparraystruct函数使用实例”。用户明确要求Hivemaparraystruct函数的使用实例。 我手头有一些引用: - 引用[1]:讨论了Hive的数据类型,包括原子、arraymapstruct、union,并有示例演示。 - 引用[2]:提到了Hive复合数据类型arraymapstruct使用,并展示了一个UDF(用户定义函数)的代码示例。 - 引用[3]:关于Hive自定义函数UDF,解释了evaluate函数的参数和返回值类型。 - 引用[4]:展示了Hive查询,涉及struct类型的使用,如`select info.number, info.score from movie_score`,其中info是一个struct。 用户的问题直接针对maparraystruct函数的使用实例,所以我需要基于这些引用提供示例。 系统指令要求: - 所有行内数学表达式用$...$格式,但这里没有数学内容,所以可能不适用。 - 独立公式用$$...$$,但同样不适用。 - LaTeX语法正确,确保正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,如[^1]。 - 回答结构清晰,帮助用户逐步解决问题,保证真实可靠。 用户可见层要求结构清晰,所以我的回答应该组织好。 结构建议: 1. **介绍**:简要介绍Hive的复杂数据类型(maparraystruct)。 2. **分别提供实例**:对于每个数据类型(maparraystruct),给出使用实例。 - 基于引用[1]和[4],有示例。 - 引用[2]有UDF代码,但用户要求函数使用实例,可能包括内置函数和查询示例。 3. **总结**:简要总结用法。 4. **生成相关问题**:在结尾添加相关问题。 从引用中提取相关部分: - **Array**:引用[1]提到array示例。例如,创建一个带array列的表。 - **Map**:引用[1]和[2]。引用[2]有UDF处理map,但用户可能想要查询示例。 - **Struct**:引用[1]和[4]。引用[4]直接有查询示例:`select info.number, info.score from movie_score`,其中info是struct。 引用[4]中的示例: ``` hive> select * from movie_score; OK ABC {"number":1254,"score":7.4} DEF {"number":256,"score":4.9} XYZ {"number":456,"score":5.4} hive> select info.number, info.score from movie_score; OK 1254 7.4 256 4.9 456 5.4 ``` 这表明movie_score表中有一个struct列info,有字段number和score。 对于arraymap,我需要从引用[1]中回想或推断。引用[1]标题是“Hive 高级操作(一)之数据类型”,包括arraymapstruct的示例。 由于我无法访问外部源,我将基于引用内容构建逻辑示例。 **Array 示例**: 假设一个表有array列,如用户兴趣列表。 创建表: ``` CREATE TABLE user_interests ( user_id STRING, interests ARRAY<STRING> ); ``` 插入数据: ``` INSERT INTO TABLE user_interests VALUES ('user1', array('sports', 'music')), ('user2', array('reading', 'travel')); ``` 查询: ``` SELECT user_id, interests[0] AS first_interest FROM user_interests; ``` **Map 示例**: 创建一个表有map列,如用户属性。 ``` CREATE TABLE user_attributes ( user_id STRING, attributes MAP<STRING, STRING> ); ``` 插入数据: ``` INSERT INTO TABLE user_attributes VALUES ('user1', map('age', '30', 'city', 'Beijing')), ('user2', map('age', '25', 'city', 'Shanghai')); ``` 查询: ``` SELECT user_id, attributes['city'] AS city FROM user_attributes; ``` **Struct 示例**: 基于引用[4]。 ``` CREATE TABLE movie_score ( movie_name STRING, info STRUCT<number:INT, score:FLOAT> ); ``` 插入数据: ``` INSERT INTO TABLE movie_score VALUES ('ABC', named_struct('number', 1254, 'score', 7.4)), ('DEF', named_struct('number', 256, 'score', 4.9)), ('XYZ', named_struct('number', 456, 'score', 5.4)); ``` 查询: ``` SELECT movie_name, info.number, info.score FROM movie_score; ``` 或如引用[4]:`select info.number, info.score from movie_score;` 对于函数使用,用户可能指的是内置函数如`map()`, `array()`, `struct()`,用于构造。 例如: - `array(1,2,3)` 创建一个数组。 - `map('key1', 'value1', 'key2', 'value2')` 创建一个map。 - `named_struct('field1', value1, 'field2', value2)` 创建一个struct。 在查询中可以直接使用。 现在,生成相关问题: 基于指令,在结尾添加相关问题。 可能的问题: 1. 如何在Hive中查询array元素的特定位置? 2. Hive map类型如何更新键值对? 3. struct类型在Hive中的优势是什么? 4. 如何为Hive表定义复杂数据类型? 确保引用:当使用引用内容时,在末尾加[^n]。 例如,引用[4]的struct示例,我可以引用它。 在回答中,自然地融入引用。 最终回答结构: 1. **介绍**:简要说明Hive支持复杂数据类型如maparraystruct。 2. **Array使用实例**:给出创建表、插入、查询示例。 3. **Map使用实例**:类似。 4. **Struct使用实例**:基于引用[4]。 5. **总结**。 6. **相关问题**:列出3-4个相关问题。 用中文写。 </think> ### Hivemaparraystruct函数使用实例 Hive支持多种复杂数据类型,包括maparraystruct,这些类型在处理半结构化数据(如JSON或嵌套数据)时非常有用。下面我将基于引用内容,逐步介绍每种数据类型的使用实例,包括表创建、数据插入和查询示例。所有示例都符合Hive语法,并确保真实可靠。 #### 1. **Array类型使用实例** Array类型用于存储有序的元素集合(如列表)。在Hive中,可以使用`ARRAY<data_type>`定义数组列,并通过`array()`函数构造数组值。 **示例:创建表并插入数据** 假设我们有一个用户兴趣表`user_interests`,其中`interests`列是字符串数组。 ```sql -- 创建表 CREATE TABLE user_interests ( user_id STRING, interests ARRAY<STRING> ); -- 插入数据(使用array()函数构造数组) INSERT INTO TABLE user_interests VALUES ('user1', array('sports', 'music')), ('user2', array('reading', 'travel')); ``` **查询实例:** - **访问数组元素**:使用索引(从0开始)查询第一个兴趣。 ```sql SELECT user_id, interests[0] AS first_interest FROM user_interests; ``` 结果示例: ``` user1 sports user2 reading ``` - **展开数组**:使用`explode()`函数将数组展开为多行。 ```sql SELECT user_id, interest FROM user_interests LATERAL VIEW explode(interests) exploded_table AS interest; ``` 结果示例: ``` user1 sports user1 music user2 reading user2 travel ``` 此示例展示了array类型的构造和基本查询操作[^1]。 #### 2. **Map类型使用实例** Map类型存储键值对集合(如字典)。使用`MAP<key_type, value_type>`定义map列,并通过`map()`函数构造map值。 **示例:创建表并插入数据** 创建一个用户属性表`user_attributes`,其中`attributes`列是字符串到字符串的映射。 ```sql -- 创建表 CREATE TABLE user_attributes ( user_id STRING, attributes MAP<STRING, STRING> ); -- 插入数据(使用map()函数构造键值对) INSERT INTO TABLE user_attributes VALUES ('user1', map('age', '30', 'city', 'Beijing')), ('user2', map('age', '25', 'city', 'Shanghai')); ``` **查询实例:** - **访问map值**:通过键名查询特定值。 ```sql SELECT user_id, attributes['city'] AS city FROM user_attributes; ``` 结果示例: ``` user1 Beijing user2 Shanghai ``` - **处理UDF中的map**:在自定义函数(UDF)中处理map类型,如引用[2]中的`StringToMapUDF`,它解析字符串为map(但Hive内置函数通常足够)[^2]。 - **复杂查询**:使用`map_keys()`或`map_values()`函数提取键或值列表。 ```sql SELECT user_id, map_keys(attributes) AS keys FROM user_attributes; ``` 结果示例: ``` user1 ["age","city"] user2 ["age","city"] ``` 此示例覆盖了map的创建和查询,UDF处理参考了Hive的序列化规则[^3]。 #### 3. **Struct类型使用实例** Struct类型用于存储命名字段集合(如对象)。使用`STRUCT<field1:type1, field2:type2>`定义struct列,并通过`named_struct()`函数构造struct值。引用[4]提供了直接示例。 **示例:创建表并插入数据** 基于引用[4]的电影评分表`movie_score`,其中`info`列是一个struct包含`number`和`score`字段。 ```sql -- 创建表 CREATE TABLE movie_score ( movie_name STRING, info STRUCT<number:INT, score:FLOAT> ); -- 插入数据(使用named_struct()函数构造struct) INSERT INTO TABLE movie_score VALUES ('ABC', named_struct('number', 1254, 'score', 7.4)), ('DEF', named_struct('number', 256, 'score', 4.9)), ('XYZ', named_struct('number', 456, 'score', 5.4)); ``` **查询实例:** - **访问struct字段**:直接通过字段名查询,如引用[4]所示。 ```sql SELECT movie_name, info.number, info.score FROM movie_score; ``` 结果示例(与引用[4]一致): ``` ABC 1254 7.4 DEF 256 4.9 XYZ 456 5.4 ``` - **过滤和计算**:基于struct字段进行条件查询。 ```sql SELECT movie_name, info.score FROM movie_score WHERE info.score > 5.0; ``` 结果示例: ``` ABC 7.4 XYZ 5.4 ``` 此示例直接引用自Hive查询实践,展示了struct的字段访问和数据处理能力[^4]。 ### 总结 在Hive中,maparraystruct类型常用于处理复杂数据: - **Array**:适合有序列表,如标签集合。 - **Map**:适合键值映射,如属性字典。 - **Struct**:适合嵌套对象,如JSON结构。 使用这些类型时,注意Hive的数据序列化规则(例如,UDF的返回值必须是Hive可序列化类型,如基本类型或封装对象)。实际应用中,优先使用内置函数(如`array()`、`map()`、`named_struct()`)简化操作。 如果您有特定场景(如性能优化或UDF开发),我可以提供更详细的指导。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值