欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hive案例之股票分析

程序员文章站 2022-05-01 12:09:55
...

Hive案例之股票分析

需求

​ 中国的股票市场日益成熟。最近受美国股票波动冲击,股票也波动比较厉害。请按如下交易明细进行分析。

​ 如下数据保存在gupiao.txt中:

序号 股票号 股票名称 行业 交易平台 交易额(万)手
1,600462,九有股份,5G通讯,同花顺,10160
2,600695,绿庭投资,5G通讯,同花顺,10130
3,2575,群兴玩具,5G通讯,同花顺,10110
4,300392,腾信股份,5G通讯,同花顺,10080
5,300464,星徽精密,医疗,同花顺,10080
6,2687,乔治白,医疗,同花顺,10070
7,300162,雷曼股份,医疗,同花顺,10070
8,603323,吴江银行,医疗,同花顺,10070
9,600622,光大嘉宝,医疗,同花顺,10060
10,300281,金明精机,环保,同花顺,10050
11,2504,弘高创意,环保,同花顺,10040
12,2807,江阴银行,环保,同花顺,10040
13,2857,三晖电气,环保,同花顺,10040
14,600908,无锡银行,环保,同花顺,10040
15,2654,万润科技,高端制造,同花顺,10030
16,600311,荣华实业,高端制造,同花顺,10030
17,2856,美芝股份,高端制造,同花顺,10020
18,300444,双杰电气,国防军工,同花顺,10020
19,600746,江苏索普,国防军工,同花顺,10020
20,300384,三联虹普,国防军工,同花顺,10010
21,600462,九有股份,5G通讯,大智慧,10010
22,600695,绿庭投资,5G通讯,大智慧,10000
23,2575,群兴玩具,5G通讯,大智慧,10000
24,300392,腾信股份,5G通讯,大智慧,10000
25,300464,星徽精密,医疗,大智慧,10000
26,2687,乔治白,医疗,大智慧,9990
27,300162,雷曼股份,医疗,大智慧,9990
28,603323,吴江银行,医疗,大智慧,9980
29,600622,光大嘉宝,医疗,大智慧,9980
30,300281,金明精机,环保,大智慧,9970
31,2504,弘高创意,环保,通信达,9960
32,2807,江阴银行,环保,通信达,9950
33,2857,三晖电气,环保,通信达,9940
34,600908,无锡银行,环保,通信达,9940
35,2654,万润科技,高端制造,通信达,9940
36,600311,荣华实业,高端制造,通信达,9940
37,2856,美芝股份,高端制造,通信达,9940
38,300444,双杰电气,国防军工,通信达,9850
39,600746,江苏索普,国防军工,通信达,9840
40,300384,三联虹普,国防军工,通信达,8280
41,600462,九有股份,5G通讯,通信达,8260
42,600695,绿庭投资,5G通讯,通信达,8210
43,2575,群兴玩具,5G通讯,通信达,8120
44,300392,腾信股份,5G通讯,通信达,8110
45,300464,星徽精密,医疗,通信达,7850
46,2687,乔治白,医疗,通信达,7720
47,300162,雷曼股份,医疗,通信达,7660
48,603323,吴江银行,医疗,钱龙,8660
49,600622,光大嘉宝,医疗,钱龙,9660
50,300281,金明精机,环保,钱龙,10660
51,2504,弘高创意,环保,钱龙,11660
52,2807,江阴银行,环保,钱龙,12660
53,2857,三晖电气,环保,钱龙,13660
54,600908,无锡银行,环保,钱龙,14660
55,2654,万润科技,高端制造,钱龙,15660
56,600311,荣华实业,高端制造,钱龙,16660
57,2856,美芝股份,高端制造,钱龙,17660
58,300444,双杰电气,国防军工,钱龙,18660
59,600746,江苏索普,国防军工,钱龙,19660
60,300384,三联虹普,国防军工,钱龙,20660
  • 创建Hive分区表表名为sockinfo,按照行业进行分区,分区字段名自定义。
  • 将以上信息导入到Hive表中
  • 按交易平台统计交易额前3的记录
  • 创建Hive自定义函数,功能是根据平台区分平台性质同花顺,钱龙 为国营,其余为私营。
  • 查询5G通讯分区对应的所有数据,信息包括:股票号 股票名称 行业 交易平台 ,平台性质。

实现

  • 创建Hive分区表表名为sockinfo,按照行业进行分区,分区字段名自定义。

    create table sockinfo_tmp(
      id int,
      stockno string,
      stockname string,
      trade string,
      platform string,
      volume int)
    row format delimited fields terminated by ','
    stored as textfile tblproperties('skip.header.line.count'='1');
    
    load data local inpath '/home/test/hive-2.3.7/data/gupiao.txt' into table sockinfo_tmp;
    
    create table sockinfo(
      id int,
      stockno string,
      stockname string,
      trade string,
      platform string,
      volume int)
    partitioned by (trade_p string)
    row format delimited fields terminated by ','
    stored as textfile;
    
  • 将以上信息导入到Hive表中

    • 由于按行业分区,行业字段是中文,需考虑mysql中hive数据库存储中文分区字段的问题。

      # 查看数据库编码是否都是utf-8
      show variables like '%char%';
      # 如果是character_set_database=latin1,character_set_server=latin1,需关闭mysql,配置my.cnf配置文件(/etc/my.cnf或/usr/my.cnf)
      [mysqld]
      character-set-server=utf8
      # 重启mysql
      service mysql restart
      
      #修改hive database编码
      alter database hive default character set utf8;
      #修改table编码
      alter table PARTITIONS default character set utf8;
      alter table PARTITION_KEY_VALS default character set utf8;
      alter table SDS default character set utf8;
      #修改字段编码
      alter table PARTITIONS modify column PART_name varchar(190) character set utf8;
      alter table PARTITION_KEY_VALS modify column PART_KEY_VAL varchar(256) character set utf8;
      alter table SDS modify column LOCATION varchar(4000) character set utf8;
      
    • 导入数据

      insert into sockinfo partition(trade_p) select *, 
      trade as trade_p from sockinfo_tmp;
      
  • 按交易平台统计交易额前3的记录

    select * from (select *,row_number() over(partition by platform order by volume desc) rank from sockinfo)t where t.rank<=3;
    
  • 创建Hive自定义函数,功能是根据平台区分平台性质同花顺,钱龙 为国营,其余为私营。

    • 导入依赖包

      <dependencies>
      	<dependency>
      		<groupId>org.apache.hive</groupId>
      		<artifactId>hive-exec</artifactId>
      		<version>2.3.7</version>
      	</dependency>
      </dependencies>
      
    • 编写UDF类

      package com.xxx.hive.udf;
      
      import org.apache.hadoop.hive.ql.exec.UDF;
      
      public class TypeUDF extends UDF {
          public String evaluate(String platform) {
              String type = null;
              if ("同花顺".equals(platform) || "钱龙".equals(platform)) {
                  type = "国营";
              } else {
                  type = "私营";
              }
              return type;
          }
      }
      
    • 打jar包
      Hive案例之股票分析

    • 上传到Linux

    • 注册函数(二选一)

      • 注册临时函数

        bin/hive中,执行如下语句:

        • 添加jar到classpath中(不论jar是否在hive的lib目录下,都需要执行此语句)

          add jar /home/test/hive-2.3.7/hive_demo-1.0-SNAPSHOT.jar;
          
        • 注册函数

          create temporary function get_type as 'com.xxx.hive.udf.TypeUDF';
          
        • 查看函数

          show functions;
          
        • 使用函数

          select *,get_type(platform) from sockinfo;
          
        • 删除函数

          drop temporary function get_type;
          
      • 注册永久函数

        • 如果是使用bin/hiveserver2方式,需配置conf/hive-site.xml配置文件,添加如下配置

          <property>
             <name>hive.aux.jars.path</name>
             <value>file:///home/test/hive-2.3.7/hive_demo-1.0-SNAPSHOT.jar</value>
          </property>
          
        • 如果使用bin/hive方式,需配置conf/hive-env.sh,添加

          export HIVE_AUX_JARS_PATH=/home/test/hive-2.3.7/lib/json-serde-1.3.8-jar-with-dependencies.jar,/home/test/hive-2.3.7/lib/app_logs_hive-1.0-SNAPSHOT.jar,/home/test/hive-2.3.7/hive_demo-1.0-SNAPSHOT.jar
          
        • 在bin/hive中,注册永久函数(函数在哪个database注册,就在哪个database中使用和删除)

          create function get_type as 'com.xxx.hive.udf.TypeUDF';
          
        • 在mysql的hive数据库下FUNCS表中查看新注册的函数

          mysql -uroot -pxxxx
          
          use hive
          
          select * from FUNCS;
          
        • 使用函数

          select *,get_type(platform) from sockinfo;
          
        • 删除函数

          drop function get_type;
          
  • 查询5G通讯分区对应的所有数据,信息包括:股票号 股票名称 行业 交易平台 ,平台性质。

    select *,get_type(platform) type from sockinfo where trade_p='5G通讯';
    
相关标签: hive 大数据