系统学习hive programming,第三章----数据类型,见表

来源:互联网 发布:头像改画风软件 编辑:程序博客网 时间:2024/05/29 02:54
/*
*    Lee 2013.11.11翻译  《programming hive》 第三章节Data Types and File Formats
 @page表示 翻译原文页码
*/

@@ page41

Hive支持常见的基础关系型数据库类型,同时还支持集合类型(collection data types)
           Hive支持的基础数据类型
===================================================
类型        |Size|   示例

TINYINT     |1byte| 一字节带符号整型 20
SMALLINT    |2byte| 二字节带符号整型 20
INT         |4byte| 四字节带符号整型 20
BIGINT      |8byte| 八字节带符号整型  20
BOOLEAN     |1byte| 布尔型    TRUE
FLOAT               单精度浮点    3.14159
DOUBLE              双精度浮点    3.14159
STRING              字符串,每个字符可以设置
TIMESTAMP   |Integer, float, or string|
====================================================
TIMESTAMP Integer为Unix时间戳,String为时间表示


@@page 42


Hive由JAVA实现,其类型有相应的JAVA类型实现,如String ,float,对应JAVA相应类型
注意,Hive没有要求最大字符串长度定义类似varchar(100).应为Hive中字段用分隔号隔开。
传统关系型数据库使用最大字符串定义,主要是为了优化其单个查询操作OLTP特性。而Hadoop
强调优化磁盘读写,海量IO、故而最大字符长度限制在HIVE中不重要。

INT FLOAT  DOUBLE 可以互相转换,字符串亦可解释为整形。使用... cast(s AS INT) ...;
详情见本书109页


@@page 43
集合类型(collection data types)
==========================================================================
类型        解释                                       示例
STRUCT    类似C语言结构体                    struct('John', 'Doe')
MAP        键值对,用name['last']取          map('first', 'John','last', 'Doe')
ARRAY      数组,用下标取 name[1]-> 'Doe'    array('John', 'Doe')
=========================================================================


为了维护关系型系统规范化,传统关系型数据库一般不支持集合类型。子类型的泛化
用多表外键连接表表示。在大数据处理实践中,打破关系范式就非常有必要。最直观的
好处在于,数据连续存放,减少硬盘寻道时间,提高IO速度。

Hive中没有主键的概念,但支持建立索引,在第七章中具体讨论index的问题。

一个人力资源应用示例:
CREATE TABLE employees (
name STRING,
salary FLOAT,
subordinates ARRAY<STRING>,
deductions MAP<STRING, FLOAT>,
address STRUCT<street:STRING, city:STRING, state:STRING, zip:INT>);

subordinates是下属名单, 为String数组。没有下属的雇员subordinates字段为空数组。
deductions是工资扣除项目,类似<‘公积金’,600>,<‘个税’,100> 为一个Map。
address是一个混合类型示例,采用自定义结构体。



@@ P45
#文本存储数据格式组织

在文本中,我们习惯用逗号, 或者制表符区分一个字段。 然而,这样和数据中的逗号(制表符)
冲突。 Hive默认使用一下分隔符。

=========================================================
分隔符          描述
\n            区别一行
^A (ctrl-A)   分隔字段,在见表语句中使用 \001
^B            分隔ARRAY、STRUCT中元素,分隔各对MapKey \002
^C            分隔键值对中的 键和值    \003
========================================================

在上个人力资源应用示例中,数据将如一下方式存放
John Doe^A100000.0^AMary Smith^BTodd Jones^AFederal Taxes^C.2^BState
Taxes^C.05^BInsurance^C.1^A1 Michigan Ave.^BChicago^BIL^B60600
Mary Smith^A80000.0^ABill King^AFederal Taxes^C.2^BState Taxes^C.
05^BInsurance^C.1^A100 Ontario St.^BChicago^BIL^B60601
Todd Jones^A70000.0^AFederal Taxes^C.15^BState Taxes^C.03^BInsurance^C.
1^A200 Chicago Ave.^BOak Park^BIL^B60700

完整的人力资源应用见表语句如下:
CREATE TABLE employees (
name STRING,
salary FLOAT,
subordinates ARRAY<STRING>,
deductions MAP<STRING, FLOAT>,
address STRUCT<street:STRING, city:STRING, state:STRING, zip:INT>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'
COLLECTION ITEMS TERMINATED BY '\002'
MAP KEYS TERMINATED BY '\003'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;


原创粉丝点击