数据:stock.csv

    tradedate tradetime stockid buyprice buysize sellprice sellsize
    交易日期 交易时间 股票id 买入价格 买入数量 卖出价格 卖出数量

    要求(录屏):
    1)创建hive数据表
    2)利用自定义函数UDF,计算股票’204001’:每天所有买入价格和卖出价格的最大值、每天所有买入价格和卖出价格的最小值
    3)利用hql语句,计算股票’204001’每天每分钟的平均交易价格。
    4)利用窗口函数,对股票’131800’的所有买入价格按照从大到小排序,并生成序号。

    实现步骤:
    1)创建数据表(也可创建分区表)

    1. create table stock(
    2. tradedate string,
    3. tradetime string,
    4. stockid string,
    5. buyprice double,
    6. buysize int,
    7. sellprice double,
    8. sellsize int)
    9. row format delimited fields terminated by ',' stored as textfile;
    10. load data local inpath '/home/hadoop/stock.csv' into table stock;

    2)利用自定义函数UDF,计算股票’204001’:每天所有买入价格和卖出价格的最大值、每天所有买入价格和卖出价格的最小值
    自定义函数:

    1. package hive_test;
    2. import org.apache.hadoop.hive.ql.exec.UDF;
    3. public class priceMax extends UDF{
    4. public Double evaluate(Double a, Double b) {
    5. if(a==null)
    6. a=0.0;
    7. if(b==null)
    8. b=0.0;
    9. if(a>=b){
    10. return a;
    11. }else{
    12. return b;
    13. }
    14. }
    15. }
    16. public class priceMin extends UDF{
    17. public Double evaluate(Double a, Double b) {
    18. if(a==null)
    19. a=0.0;
    20. if(b==null)
    21. b=0.0;
    22. if(a>=b){
    23. return b;
    24. }else{
    25. return a;
    26. }
    27. }
    28. }

    打包后在hive中执行:

    1. add jar /home/hadoop/priceMax.jar;
    2. add jar /home/hadoop/priceMin.jar;
    3. create temporary function priceMax as 'hive_test.priceMax';
    4. create temporary function priceMin as 'hive_test.priceMin';
    5. select tradedate,max(priceMax(buyprice,sellprice)) maxprice,min(priceMin(buyprice,sellprice)) minprice from stock where stockid='204001' group by tradedate;

    3)利用hql语句,计算股票’204001’每天每分钟的平均交易价格。

    1. select stockid,tradedate,substring(tradetime,0,4),sum(buyprice+sellprice)/(count(*)*2) from stock where stockid='204001' group by stockid, tradedate,substring(tradetime,0,4);

    4)利用窗口函数,对股票’131800’的所有买入价格按照从大到小排序,并生成序号。

    1. select tradedate,buyprice,row_number() over(order by buyprice desc) from stock where stockid='131800'
    2. #排序函数用row_number()/rank()/dense_rank()都可以