Hive-集合数据类型

梦里梦外; 2022-09-16 01:28 291阅读 0赞

除了使用础的数据类型string等,Hive中的列支持使用struct, map, array集合数据类型。

三种集合

1)STRUCT
和C语言中的struct或者”对象”类似,都可以通过”点”符号访问元素内容。 struct{‘John’, ‘Doe’}
2)MAP
MAP是一组键-值对元素集合,使用key可以访问元素。 map(‘fisrt’, ‘John’, ‘last’, ‘Doe’)
3)ARRAY
数组是一组具有相同数据类型和名称的变量的集合。 Array(‘John’, ‘Doe’)
补充的知识点:

  1. row format delimited fields terminated by ',' -- (字段分隔符)列分隔符
  2. collection items terminated by '_' --MAP STRUCT ARRAY 的分隔符(数据分割符号)
  3. map keys terminated by ':' -- MAP 中的 key value 的分隔符
  4. lines terminated by '\n'; -- 行分隔符

Array的使用

(1)创建数据库表,以array作为数据类型

  1. create table person(
  2. name string,
  3. work_locations array<string>
  4. )
  5. row format delimited
  6. fields terminated by '\t'
  7. collection items terminated by ',';

这里面有一个点是需要注意:row format delimited fields terminated by ‘\t’ 代表的是字段用tab键进行分割,同时,写完之后是没有加逗号的,\t末尾是空的!!!
collection items terminated by ‘,’代表的是集合用逗号分割!!!

(2)在本地 /opt/module/datas目录下建立文件person.txt:

  1. biansutao beijing,shanghai,tianjin,hangzhou
  2. linan changchu,chengdu,wuhan

导入到hive person表当中:

  1. load data local inpath '/opt/module/datas/person.txt' overwrite into table default.person;

(3)查询数据:

  1. hive (default)> select * from person;
  2. OK
  3. person.name person.work_locations
  4. biansutao ["beijing","shanghai","tianjin","hangzhou"]
  5. linan ["changchu","chengdu","wuhan"]
  6. Time taken: 0.074 seconds, Fetched: 2 row(s)
  7. hive (default)> select name from person;
  8. OK
  9. name
  10. biansutao
  11. linan
  12. Time taken: 0.14 seconds, Fetched: 2 row(s)
  13. hive (default)> select work_locations from person;
  14. OK
  15. work_locations
  16. ["beijing","shanghai","tianjin","hangzhou"]
  17. ["changchu","chengdu","wuhan"]
  18. Time taken: 0.13 seconds, Fetched: 2 row(s)
  19. hive (default)> select work_locations[0] from person;
  20. OK
  21. _c0
  22. beijing
  23. changchu
  24. Time taken: 0.161 seconds, Fetched: 2 row(s)
  25. hive (default)> select work_locations[4] from person;
  26. OK
  27. _c0
  28. NULL
  29. NULL
  30. Time taken: 0.084 seconds, Fetched: 2 row(s)

Map 的使用

(1)创建数据库表,以map作为数据类型

  1. create table score(
  2. name string,
  3. score map<string,int>
  4. )
  5. row format delimited
  6. fields terminated by '\t'
  7. collection items terminated by ','
  8. map keys terminated by ':';

以map为主要数据结构的时候,我一开始是没有写collection items terminated by ‘,’这句分隔符的,我的想法是:map只要分割到map keys就可以,但是后面load data的时候才发现了问题,问题就出在如果map的字段是多个键值对,其中用逗号隔开,导入数据就会出错。

(2) 编辑vim score.txt:

  1. biansutao '数学':80,'语文':89,'英语':95
  2. jobs '语文':60,'数学':80,'英语':99

导入数据:

  1. load data local inpath '/opt/module/datas/score.txt'
  2. overwrite into table default.score;

查询数据:

  1. hive (default)> select score["'数学'"] from score;
  2. OK
  3. _c0
  4. 80
  5. 80

我发现一个问题,当我设置map的key为中文的字符时,在选取的时候,总会出现一些奇奇怪怪的问题,上面这条数据也是试了好几次才取到这条数据,以后在开发过程中尽量不写中文。总结:map选取key取到对应value的方法就是: 字段名[‘key’].
取这个数据的时候,又发现了一个注意点就是:表名可以和字段名相同!!!

Struct 的使用

(1)创建数据表

  1. CREATE TABLE test(id int,course struct<course:string,score:int>)
  2. ROW FORMAT DELIMITED
  3. FIELDS TERMINATED BY '\t'
  4. COLLECTION ITEMS TERMINATED BY ',';

(2)数据: vim test.txt:

  1. 1 english,80
  2. 2 math,89
  3. 3 chinese,95

(3)导入到表当中:

  1. load data local inpath '/opt/module/datas/test.txt'
  2. into table default.test;

(4)查询数据:

  1. hive (default)> select * from test;
  2. OK
  3. test.id test.course
  4. 1 { "couse":"english","score":80}
  5. 2 { "couse":"math","score":89}
  6. 3 { "couse":"chinese","score":95}
  7. Time taken: 0.075 seconds, Fetched: 3 row(s)
  8. hive (default)> select course.couse from test;
  9. OK
  10. couse
  11. english
  12. math
  13. chinese
  14. Time taken: 0.351 seconds, Fetched: 3 row(s)
  15. hive (default)> select course.score from test;
  16. OK
  17. score
  18. 80
  19. 89
  20. 95
  21. Time taken: 0.105 seconds, Fetched: 3 row(s)

类型转换

在Hive中,TINYINT可以转化为INT,但是HIVE不会进行反向转化,例如,某表达式使用 TINYINT 类型,INT 不会自动转换为 TINYINT 类型,它会返回错误,除非使用 CAST 操作。
隐式类型转换规则如下:
(1)任何整数类型都可以隐式地转换为一个范围更广的类型,如 TINYINT 可以转换成INT,INT 可以转换成 BIGINT。
(2)所有整数类型、FLOAT 和 STRING 类型都可以隐式地转换成 DOUBLE。
(3)TINYINT、SMALLINT、INT 都可以转换为 FLOAT。
(4)BOOLEAN 类型不可以转换为任何其它的类型。

可以使用 CAST 操作显示进行数据类型转换
例如 CAST(‘1’ AS INT)将把字符串’1’ 转换成整数 1;如果强制类型转换失败,如执行 CAST(‘X’ AS INT),表达式返回空值 NULL。

发表评论

表情:
评论列表 (有 0 条评论,291人围观)

还没有评论,来说两句吧...

相关阅读