Hive数据库系列--Hive数据类型/Hive字段类型/Hive类型转换/文本文件数据编码

缺乏、安全感 2024-02-17 13:05 125阅读 0赞

文章目录

  • 一、Hive数据类型
    • 1.1、数值类型
    • 1.2、字符类型
    • 1.3、日期时间类型
    • 1.4、其他类型
    • 1.5、集合数据类型
      • 1.5.1、Struct举例
      • 1.5.2、Array举例
      • 1.5.3、Map举例
  • 二、数据类型转换
      • 2.1、隐式转换
      • 2.2、显示转换
  • 三、字段类型的使用
    • 3.1、DECIMAL(precision,scale)
  • 四、文本文件数据编码

本章主要讲解hive的数据类、字段类型。官网文档地址见https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types

一、Hive数据类型

数据类型主要是指create table的时候表中字段的类型,如int、string、decimal等等。

  1. create table test_user
  2. (
  3. id int comment '主键',
  4. name string comment '姓名',
  5. score struct<math:int,computer:int>
  6. )
  7. comment '测试用户表'
  8. row format delimited fields terminated by ','
  9. collection items terminated by '_'
  10. lines terminated by '\n';

1.1、数值类型






























































Hive 数据类型 Java 数据类型 长度 范围 例子
TINYINT byte 1byte 有符号整数 -128 to 127 10
SMALINT short 2byte 有符号整数 -32,768 to 32,767 10
INT int 4byte 有符号整数 -2,147,483,648 to 2,147,483,647 10
BIGINT long 8byte 有符号整数 -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 20
FLOAT float 单精度浮点数 3.1415
DOUBLE double 双精度浮点数 3.1419
DECIMAL BigDecimal 17字节 38位,存储小数 10.20

1.2、字符类型

Hive的支付类型也与关系型数据库的MySQL类似。 实际使用中,String使用得最多






















数据类型 描述
String 使用时通常用单引号(‘’)或者双引号(””)引用,Hive在String中使用c样式的转义
varchar 变长字符串,最大长度为65535
char 定长字符串, 最大长度255

Hive 的 STRING 类型相当于mysql数据库的 varchar 类型,该类型是一个可变的字符串,不过它不限定最多能存储多少个字符,理论上它可以存储 2GB 的字符数。

1.3、日期时间类型

Timestamp精度高,Timestamp精度为9,可以满足对时间字段的要求。 如要使用日期时间计算,可以使用interval。


























Hive 数据类型 Java 数据类型 描述
TIMESTAMP 持传统的UNIX时间戳,可选纳秒精度,精度为9
Date 以YYYY-­MM-­DD格式存储年月日
interval INTERVAL ‘1’ DAY 增加1天
INTERVAL ‘1-2’ YEAR TO MONTH 增加1年2个月

1.4、其他类型

布尔类型表示true或false。


















数据类型 描述
Boolean true/false
BINARY 字节数组

1.5、集合数据类型

Hive中的列支持struct、map和array集合数据类型。


























数据类型 描述 语法示例
STRUCT 和 c 语 言 中 的 struct 类 似 , 都 可 以 通过“点”符号访问元素内容。例如,如果某个列的 数 据 类 型 是 STRUCT{first STRING, lastSTRING},那么第1个元素可以通过字段.first来引用。 struct(‘tom’,15) struct<name:string,age:int>
MAP MAP是一组键-值对元组集合,可以通过key来访问元素。例如,如果某个列的数据类型是MAP,其中键->值对是’first’->‘John’和’last’->‘Doe’,那么可以通过字段名[‘last’]获取最后一个元素 map<string, int>
ARRAY ARRAY是由一系列具有相同数据类型的元素组成的集合,这些些素可以通过下标来访问。例如有一个ARRAY类型的变量fruits,它是由[‘apple’,‘orange’,‘mango’]组成,那么我们可以 通 过 fruits[1] 来 访 问 元 素 orange , 因 为ARRAY类型的下标是从0开始的。 Array(‘John’, ‘Doe’)

ARRAY 和 MAP 与 Java 中的 Array 和 Map 类似,而 STRUCT 与 C 语言中的Struct 类似,它封装了一个命名字段集合,复杂数据类型允许任意层次的嵌套。

1.5.1、Struct举例

(1)假设有如下两条数据,为了便于理解,以JSON格式来表示它的数据结构:

  1. [
  2. {
  3. "stuid": 1,
  4. "stuname":'alan',
  5. "score":{
  6. "math":98,
  7. "computer":89
  8. }
  9. },
  10. {
  11. "stuid": 2,
  12. "stuname":'john',
  13. "score":{
  14. "math":95,
  15. "computer":97
  16. }
  17. }
  18. ]

(2)在目录/root/data中创建本地测试文件struct.txt,保存下面的数据。

  1. 1,alan,98_89
  2. 2,john,95_97

在这里插入图片描述
(3)在Hive上创建测试表test_struct

  1. create table test_struct
  2. (
  3. stuid int,
  4. stuname string,
  5. score struct<math:int,computer:int>
  6. )
  7. row format delimited fields terminated by ','
  8. collection items terminated by '_'
  9. lines terminated by '\n';

在这里插入图片描述
字段解释:

  1. row format delimited fields terminated by ',' -- 列分隔符
  2. collection items terminated by '_' -- MAP STRUCTARRAY的分隔符(数据分割符号)
  3. lines terminated by '\n'; -- 行分隔符

(4)接下来,导入struct.txt中的文本数据到测试表test_struct

  1. load data local inpath '/root/data/struct.txt' into table test_struct;

(5)访问表test_struct中的数据

  1. select * from test_struct;

在这里插入图片描述
(6)访问结构中的数据

  1. select stuname,score.math,score.computer from test_struct;

在这里插入图片描述

1.5.2、Array举例

(1)假设有如下两条数据,为了便于理解,以JSON格式来表示它的数据结构:

  1. [
  2. {
  3. "stuid": 1,
  4. "stuname":'alan',
  5. "hobbys":["music","sports"]
  6. },
  7. {
  8. "stuid": 2,
  9. "stuname":'john',
  10. "hobbys":["music","travel"]
  11. }
  12. ]

(2)在目录/root/data中创建本地测试文件array.txt,保存下面的数据。

  1. 1,alan,music_sports
  2. 2,john,music_travel

在这里插入图片描述
(3)在Hive上创建测试表test_array

  1. create table test_array
  2. (
  3. stuid int,
  4. stuname string,
  5. hobbys array<string>
  6. )
  7. row format delimited fields terminated by ','
  8. collection items terminated by '_'
  9. lines terminated by '\n';

(4)接下来,导入array.txt中的文本数据到测试表test_array

  1. load data local inpath '/root/data/array.txt' into table test_array;

(5)访问表test_array中的数据

  1. select * from test_array;

在这里插入图片描述
(6)访问数组中的数据

  1. set hive.cli.print.header=true;
  2. select stuname,hobbys[0] from test_array;

在这里插入图片描述

1.5.3、Map举例

(1)假设有如下两条数据,为了便于理解,以JSON格式来表示它的数据结构:

  1. [
  2. {
  3. "stuid": 1,
  4. "stuname":'alan',
  5. "score":{
  6. "math":98,
  7. "computer":89
  8. }
  9. },
  10. {
  11. "stuid": 2,
  12. "stuname":'john',
  13. "score":{
  14. "math":95,
  15. "computer":97
  16. }
  17. }
  18. ]

(2)在目录/root/data中创建本地测试文件 map.txt,保存下面的数据。

  1. 1,alan,math:98_computer:89
  2. 2,john,math:95_computer:97

在这里插入图片描述

3)在Hive上创建测试表test_map

  1. create table test_map
  2. (
  3. stuid int,
  4. stuname string,
  5. score map<string,int>
  6. )
  7. row format delimited fields terminated by ','
  8. collection items terminated by '_'
  9. map keys terminated by ':'
  10. lines terminated by '\n';

字段解释:

  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'; -- 行分隔符

(4)接下来,导入map.txt中的文本数据到测试表test_map

  1. load data local inpath '/root/data/map.txt' into table test_map;

(5)访问表test_map中的数据

  1. set hive.cli.print.header=true;
  2. select * from test_map;

在这里插入图片描述
(6)访问map中的数据

  1. select stuname,score['math'] as math,score['computer'] as computer from test_map;

在这里插入图片描述

二、数据类型转换

Hive 的原子数据类型是可以进行隐式转换的,类似于 Java 的类型转换。转换的原则是从数据范围小的类型向数据范围大的类型转换,或从数据精度低的类型向数据精度高的类型转换,以保证数据和精度不丢失。例如某表达式使用 BIGINT类型,INT 会自动转换为BIGINT 类型,但是 Hive 不会进行反向转换。例如,某表达式使用 INT 类型,BIGINT 不会自动转换为 INT 类型,它会返回错误,除非使用 CAST 操作。

2.1、隐式转换

(1)任何整数类型都可以隐式地转换为一个范围更广的类型,如 TINYINT 可以转换成 INT,INT 可以转换成 BIGINT。

(2)所有整数类型、FLOAT 和 STRING 类型都可以隐式地转换成 DOUBLE。

(3)TINYINT、SMALLINT、INT 都可以转换为 FLOAT。

(4)BOOLEAN 类型不可以转换为任何其它的类型。

2.2、显示转换

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

  1. select '2'+3,cast('2' as int)+1;

在这里插入图片描述

三、字段类型的使用

3.1、DECIMAL(precision,scale)

Hive中的DECIMAL类型基于Java的BigDecimal,它用于在Java中表示不可变的任意精度十进制数。所有常规的数字操作(例如+、-、*、/)和相关的UDF(例如Floor、Ceil、Round等)都处理十进制类型。你可以像处理其他数值类型一样,将十进制类型转换为十进制类型或从十进制类型转换。decimal类型的持久性格式支持科学和非科学记数法。因此,无论数据集是否包含4.004E+3(科学计数法)或4004(非科学计数法)或两者的组合,DECIMAL都可以用于它。

从Hive 0.13开始,用户可以在使用DECIMAL(precision,scale)语法创建DECIMAL数据类型的表时指定scale和precision。 如果未指定小数位数,则默认为0(无小数位数)。如果未指定精度,则默认为10。

  1. CREATE TABLE foo (
  2. a DECIMAL, -- Defaults to decimal(10,0)
  3. b DECIMAL(9, 7)
  4. )

DECIMAL(precision,scale)说明:
precision-精度: 整数+scale的长度(即整数部分的长度最大不能超过precision-scale位)
scale-小数位: 小数部分的长度(若小数点后的长度小于scale则会自动补齐到scale位;若小数点后面的长度大于scale位则会截取scale位截取时会四舍五入)

四、文本文件数据编码

Hive中经常经使用未经压缩的文本文件来存储数据,各字段之间如何保证正确分隔,分隔符的选择十分重要,已选定的分隔符不能出现在数据中。Hive默认使用了几个控制字符,这些字符很少出现在字段值中。


























分隔符 描述
\n 对于文本文件来说,每行都是一条记录,因此换行符可以分隔记录
^A(Ctrl+V+A) 用于分隔字段(列)。在CREATE TABLE语句中可以使用八进制编码\001表示
^B(Ctrl+V+B) 用于分隔ARRAY或者STRUCT中的元素,或用于MAP中键-值对之间的分隔。在CREATE TABLE语句中可以使用八进制编码\002表示
^C(Ctrl+V+C) 用于MAP中键和值之间的分隔。在CREATE TABLE语句中可以使用八进制编码\003表示

^A / ^B / ^C 都是特殊的控制字符,使用 more 、 cat 命令是看不见的;可以使用

  1. cat -A file.dat

下面是一张员工表:

  1. CREATE TABLE employees
  2. (
  3. name STRING,
  4. salary FLOAT,
  5. subordinates ARRAY<STRING>,
  6. deductions MAP<STRING,FLOAT>,
  7. address STRUCT<street:STRING,city:STRING,state:STRING,zip:INT>
  8. );

其中,字段subordinates(下属员工)是一个字符串数组,字段deductions是一个由键-值对构成的map,其记录了每一次的扣除额。最后,每名员工的家庭住址使用struct数据类型存储。employees表的第1行记录看上去和下面展示的一样,它用到了上面表格中的分隔符。

  1. John Doe^A100000.0^AMary Smith^BTodd Jones^AFederal Taxes^C.2^BState Taxes^C.05^BInsurance^C.1^A1 Michigan Ave.^BChicage^BIL^B60600

在vi中的显示效果如下:
在这里插入图片描述

  1. 注意:"^A"不是直接按字符键^A直接输入的,而是在编辑状态下按Ctrl+V+A输入的,
  2. 同理按下Ctrl+V+B可以输入不见字符"^B"

很显然上面记录的可读性不好,把它转换成可读性好的JSON格式如下:

  1. {
  2. "name": "John Doe",
  3. "salary": 100000.0,
  4. "subordinates": ["Mary Smith","Todd Jones"],
  5. "deductions": {
  6. "Federal Taxes": .2,
  7. "State Taxes": .05,
  8. "Insurance": .1
  9. },
  10. "address": {
  11. "street": "1 Michigan Ave.",
  12. "city": "Chicago",
  13. "state": "IL",
  14. "zip": 60600
  15. }
  16. }

用户可以不使用这些默认的分隔符,而指定使用其他分隔符。下面建表语句明确指定了分隔符:

  1. CREATE TABLE employees
  2. (
  3. name STRING,
  4. salary FLOAT,
  5. subordinates ARRAY<STRING>,
  6. deductions MAP<STRING,FLOAT>,
  7. address STRUCT<street:STRING,city:STRING,state:STRING,zip:INT>
  8. )
  9. row format delimited fields terminated by '\001'
  10. collection items terminated by '\002'
  11. map keys terminated by '\003'
  12. lines terminated by '\n'
  13. stored as textfile;

目前行分隔符只支持’\n’,不能是别的字符,stored as textfile可以被省略,默认就是 textfile格式的文件。把上面输入的数据加载到employees表中:

  1. load data local inpath '/root/data/employees.txt' into table employees;

查看employees表中的数据

  1. select * from employees;

在这里插入图片描述

参考文章:https://blog.csdn.net/W\_chuanqi/article/details/131101265

发表评论

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

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

相关阅读