第2关:Hive数据类型和类型转换
任务描述
本关任务:
2013
年
7
月
25
日每种股票总共被客户买入了多少金额。
相关知识
为了完成本关任务,你需要掌握:1.
Hive
的内置数据类型,2.如何转换数据类型。
Hive的内置数据类型
Hive
的内置数据类型可以分为两大类:(1)、基础数据类型;(2)、复杂数据类型。
基本数据类型
数据类型所占字节TINYINT
1byte,-128 ~ 127
SMALLINT
2byte,-32,768 ~ 32,767
INT
4byte,-2,147,483,648 ~ 2,147,483,647
BIGINT
8byte,-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
BOOLEAN布尔类型,
true
或者
false
FLOAT
4byte
单精度DOUBLE
8byte
双精度STRING字符系列。可以指定字符集。可以使用单引号或者双引号BINARY字节数组TIMESTAMP时间类型CHARVARCHARDATE
复杂数据类型
数据类型描述STRUCT通过“.”符号访问元素内容。例如,如果某个列的数据类型是STRUCT{first STRING, lastSTRING},那么第1个元素可以通过字段.first来引用。MAPMAP是一组键-值对元组集合,使用数组表示法可以访问数据。例如,如果某个列的数据类型是MAP,其中键->值对是’first’->’John’和’last’->’Doe’,那么可以通过字段名[‘last’]获取最后一个元素ARRAY数组是一组具有相同类型和名称的变量的集合。这些变量称为数组的元素,每个数组元素都有一个编号,编号从零开始。例如,数组值为[‘John’, ‘Doe’],那么第2个元素可以通过数组名[1]进行引用
CREATE TABLE employees (
name string,
salary double,
subordinates array<string>,
deductions map<string, double>,
address struct<street:string, city:string, state:string, zip:int>
) row format delimited fields terminated by '\t'
collection items terminated by ','
map keys terminated by ':'
stored as textfile;
类型转换
Hive
中的数据类型转换包括隐式转换(
implicit conversions
)和显式转换(
explicitly conversions
)。
隐式转换
Hive在需要的时候将会对numeric类型的数据进行隐式转换。比如我们对两个不同数据类型的数字进行比较,假如一个数据类型是INT型,另一个 是SMALLINT类型,那么SMALLINT类型的数据将会被隐式转换地转换为INT类型;但是我们不能隐式地将一个 INT类型的数据转换成SMALLINT或TINYINT类型的数据,这将会返回错误,除非你使用了CAST操作。
任何整数类型都可以隐式地转换成一个范围更大的类型。TINYINT,SMALLINT,INT,BIGINT,FLOAT和STRING都可以隐式 地转换成DOUBLE;是的你没看出,STRING也可以隐式地转换成DOUBLE!但是你要记住,BOOLEAN类型不能转换为其他任何数据类型!
显式转换
表名:
user
name(string)sex(string)height(string)xiaohong女165.0xiaoming男180.0
将身高类型转换为
float
。
示例如下:
select * from user where cast(height as float) > 170.0
输出:
xiaoming 男 180.0
这样
height
将会显示的转换成
float
。如果
height
是不能转换成
float
,这时候
cast
将会返回
NULL
!
注意: (1) 如果将浮点型的数据转换成
int
类型的,内部操作是通过
round()
或者
floor()
函数来实现的,而不是通过
cast
实现!
(2) 对于
BINARY
类型的数据,只能将
BINARY
类型的数据转换成
STRING
类型。如果你确信
BINARY
类型数据是一个数字类型(
a number
),这时候你可以利用嵌套的
cast
操作,比如
a
是一个
BINARY
,且它是一个数字类型,那么你可以用下面的查询:
SELECT (cast(cast(a as string) as double)) from src;
我们也可以将一个
String
类型的数据转换成
BINARY
类型。
(3) 对于
Date
类型的数据,只能在
Date
、
Timestamp
以及
String
之间进行转换。下表将进行详细的说明:
有效的转换结果
cast(date as date)
返回
date
类型
cast(timestamp as date)
timestamp
中的年/月/日的值是依赖与当地的时区,结果返回
date
类型
cast(string as date)
如果
string
是
YYYY-MM-DD
格式的,则相应的年/月/日的
date
类型的数据将会返回;但如果
string
不是
YYYY-MM-DD
格式的,结果则会返回
NULL
。
cast(date as timestamp)
基于当地的时区,生成一个对应
date
的年/月/日的时间戳值
cast(date as string)
date
所代表的年/月/日时间将会转换成
YYYY-MM-DD
的字符串。
编程要求
在右侧编辑器补充代码,
2013
年
7
月
25
日每种股票总共被客户买入了多少元。
测试说明
表名:
total
col_namedata_typecomment
tradedate
string
交易日期
tradetime
string
交易时间
securityid
string
股票
ID
bidpx1
string
买入价
bidsize1
int
买入量
offerpx1
string
卖出价
bidsize2
int
卖出量
部分数据如下所示:
20130724 145004 152896 2.62 6960 2.63 13000
20130724 145101 152896 2.86 13880 2.89 6270
20130724 145128 152896 2.85 327400 2.851 1500
20130724 145143 152896 2.603 44630 2.8 10650
数据说明:
(152896: 每种股票id)
(20130724: 2013年7月24日)
(145004: 14点50分04秒)
平台会对你编写的代码进行测试:
预期输出:
股票
id
买入金额
125896 1.2274221965454102E7
425178 9731762.828186035
668452 8799099.5
741589 5.474477543066406E7
745962 8010476.90625
789562 3.2612930090820312E7
792583 5969130.9295043945
885478 2.469516101953125E7
968956 3356246.9372558594
提示:
(1)总共买入金额=买入量*买入价
(2)将买入价为 string,强转为 float 计算*
开始你的任务吧,祝你成功!
----------禁止修改----------
create database if not exists mydb;
use mydb;
create table if not exists total(
tradedate string,
tradetime string,
securityid string,
bidpx1 string,
bidsize1 int,
offerpx1 string,
bidsize2 int)
row format delimited fields terminated by ','
stored as textfile;
truncate table total;
load data local inpath '/root/files' into table total;
----------禁止修改----------
----------begin----------
select securityid, sum(bidsize1 * cast(bidpx1 as float))
from total
where tradedate='20130725' group by securityid
----------end----------
版权归原作者 真题OK撒 所有, 如有侵权,请联系我们删除。