一、项目背景
前两年,支付宝推出的“余额宝”赚尽无数人的眼球,同时也吸引的大量的小额资金进入。“余额宝”把用户的散钱利息提高到了年化收益率4.0%左右,比起银行活期存储存款0.3%左右高出太多了,也正在撼动着银行躺着赚钱的地位。
在金融市场,如果想获得年化收益率4%-5%左右也并非难事,通过“逆回购”一样可以。一旦遇到货币紧张时(银行缺钱),更可达到50%一天隔夜回够利率。我们就可以美美地在家里数钱了!!
所谓逆回购:通俗来讲,就是你(A)把钱借给别人(B),到期时,B按照约定利息,还给你(A)本资+利息。逆回购本身是无风险的。(操作银行储蓄存款类似)。现在火热吵起来的,阿里金融的“余额宝”利息与逆回购持平。我们可以猜测“余额 宝”的资金也在操作“逆回购”,不仅保持良好的流通性,同时也提供稳定的利息。
二、项目需求分析
通过历史数据分析,找出走势规律,发现当日高点,进行逆回购,赚取最高利息。
三、项目数据集
stock.csv
四、项目思路分析
基于项目的需求,我们可以使用Hive工具完成数据的分析。
1、首先将数据集stock.csv导入Hive中,用日期做为分区表的分区ID。
2、选取自己的股票编号stockid,分别统计该股票产品每日的最高价和最低价。
3、以分钟做为最小单位,统计出所选股票每天每分钟均价。
五、参考步骤
第一步:将数据导入Hive中
在hive中,创建 stock 表结构。
hive> create table if not exists stock (tradedate STRING,tradetime STRING,stockid STRING,buyprice DOUBLE,buysize INT,sellprice DOUBLE,sellsize INT)
>row format delimited fields terminated by ',' STORED AS TEXTFILE;
将HDFS中的股票历史数据导入hive中。
LOAD DATA INPATH '/user/hive/stock.csv' INTO TABLE stock;
创建分区表 stock_partition,用日期做为分区表的分区ID。
hive> create table if not exists stock_partition (tradetime STRING,stockid STRING,buyprice DOUBLE,buysize INT,sellprice DOUBLE,sellsize INT)
>partitioned by (tradedate STRING) row format delimited fields terminated by ',';
如果设置动态分区首先执行。
hive>set hive.exec.dynamic.partition.mode=nonstrict;
创建动态分区,将stock表中的数据导入stock_partition表。
hive> insert overwrite table stock_partition partition(tradedate)
> select tradetime,stockid,buyprice,buysize,sellprice,sellsize, tradedate from stock distribute by tradedate;
第二步:hive自定义UDF,统计204001该只股票每日的最高价和最低价
Hive 自定义Max统计最大值。
public class Max extends UDF{
public Double evaluate(Double a, Double b) {
if(a==null)
a=0.0;
if(b==null)
b=0.0;
if(a>=b){
return a;
}else{
return b;
}
}
}
Hive 自定义Min统计最小值。
public class Min extends UDF{
public Double evaluate(Double a, Double b) {
if(a==null)
a=0.0;
if(b==null)
b=0.0;
if(a>=b){
return b;
}else{
return a;
}
}
}
将自定义的Max和Min分别打包成maxUDF.jar和minUDF.jar, 然后上传至/home/hadoop/hive目录下,添加Hive自定义的UDF函数
hive> add jar /home/hadoop/hive/maxUDF.jar;
hive> add jar /home/hadoop/hive/minUDF.jar;
创建Hive自定义的临时方法maxprice和minprice。
hive> create temporary function maxprice as 'com.hadoop.hive.Max';
hive> create temporary function minprice as 'com.hadoop.hive.Min';
统计204001股票,每日的最高价格和最低价格。
hive> select stockid,tradedate, max(maxprice(buyprice,sellprice)),min(minprice(buyprice,sellprice)) from stock_partition where stockid='204001' group by tradedate;
第三步:统计每分钟均价
统计204001这只股票,每天每分钟的均价
hive> select stockid,tradedate,substring(tradetime,0,4), sum(buyprice+sellprice)/(count(*)*2) from stock_partition
where stockid='204001' group by stockid, tradedate,substring(tradetime,0,4);