• Java 之 批量从hive导入mysql(代替sqoop工具)


    一、pom

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.apache.hive/hive-jdbc -->
        <dependency>
          <groupId>org.apache.hive</groupId>
          <artifactId>hive-jdbc</artifactId>
          <version>1.1.0</version>
        </dependency>
        <dependency>
          <groupId>org.apache.hadoop</groupId>
          <artifactId>hadoop-common</artifactId>
          <version>2.6.0</version>
        </dependency>
        <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis</artifactId>
          <version>3.4.6</version>
        </dependency>
        <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>5.1.38</version>
        </dependency>
      </dependencies>

    二、目录

    三、配置类

     mybatis.cfg

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <typeAliases>
            <typeAlias type="com.njbdqn.utils.SaleOrder" alias="so"/>
        </typeAliases>
        <environments default="cm">
            <environment id="cm">
                <transactionManager type="JDBC"></transactionManager>
                <dataSource type="POOLED">
                    <property name="driver" value="org.apache.hive.jdbc.HiveDriver"/>
                    <property name="url" value="jdbc:hive2://192.168.56.111:10000/dm_sales_source"/>
                    <property name="username" value="root"/>
                    <property name="password" value="root"/>
                </dataSource>
            </environment>
            <environment id="ms">
                <transactionManager type="JDBC"></transactionManager>
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://192.168.56.111:3306/dmdb"/>
                    <property name="username" value="root"/>
                    <property name="password" value="root"/>
                </dataSource>
            </environment>
        </environments>
        <mappers>
            <mapper resource="hive_mapper.xml"></mapper>
            <mapper resource="mysql_mapper.xml"></mapper>
        </mappers>
    </configuration>

    hive_mapper.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    <mapper namespace="com.njbdqn.utils.HiveDao">
        <select id="findAll" resultType="so">
            select customer_sk ,product_sk,
            d_date,recent_num,recent_amount,order_num,order_dailyamount from dm_sales_order_count
        </select>
    </mapper>

    mysql_mapper.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    <mapper namespace="com.njbdqn.utils.MysqlDao">
        <insert id="saveDate" parameterType="java.util.List">
            insert into dm_sales_order_count values
            <foreach collection="list" item="ord" separator=",">
                (#{ord.d_date},
                #{ord.customer_sk},
                #{ord.product_sk},
                #{ord.order_num},
                #{ord.order_dailyamount},
                #{ord.recent_amount},
                #{ord.recent_num})
            </foreach>
        </insert>
    </mapper>

    三、代码

    实体类:

    public class SaleOrder {
      private String  d_date ;
      private Integer  customer_sk ;
      private Integer  product_sk;
      private Long  order_num ;
      private Double  order_dailyamount ;
      private Double  recent_amount ;
      private Long  recent_num   ;

    HiveDao

    public interface HiveDao {
        List<SaleOrder> findAll();
    }

    mysqlDao

    public interface MysqlDao {
        void saveDate(List<SaleOrder> lst);
    }

    ReadHiveTab(测试用的)

    import com.sun.org.apache.regexp.internal.RE;
    
    import java.sql.*;
    import java.util.List;
    
    public class ReadHiveTab {
        public static <T>List<T> readTab(String dbname,String table){
            try {
                Class.forName("org.apache.hive.jdbc.HiveDriver");
                Connection con = DriverManager.getConnection("jdbc:hive2://192.168.56.111:10000/"+dbname,"root","root");
                PreparedStatement pstat = con.prepareStatement("select * from "+table);
                ResultSet rs = pstat.executeQuery();
                while (rs.next()){
                    System.out.println(rs.getInt("customer_sk"));
                }
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return null;
        }
    }

    Tools(main方法):从hive到sql

    package com.njbdqn.utils;
    
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    import java.io.Reader;
    import java.util.List;
    
    public class Tools {
    
        public static void main(String[] args) throws Exception {
          //  ReadHiveTab.readTab("dm_sales_source","dm_sales_order_count");
            Reader reader  = Resources.getResourceAsReader("mybatis.cfg.xml");
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader,"cm");
            SqlSession session = factory.openSession();
            HiveDao hdao = session.getMapper(HiveDao.class);
            List<SaleOrder> lst = hdao.findAll();
            session.close();
    
            Reader r1  = Resources.getResourceAsReader("mybatis.cfg.xml");
            SqlSessionFactory mf = new SqlSessionFactoryBuilder().build(r1, "ms");
            SqlSession se = mf.openSession();
            MysqlDao mdao = se.getMapper(MysqlDao.class);
            mdao.saveDate(lst);
            se.commit();
            se.close();
        }
    }

    四、打胖包后运行(因为执行环境没有driver等)

    java -jar HiveBatchMysql.jar 

    => 验证mysql是否增加了数据

  • 相关阅读:
    java 多线程面试题
    finally语句块一定会被执行吗
    redis 数据结构
    哪些可以作为GC ROOT
    mybatis 源码分析--日志分析
    mybatis selectKey
    spring cache 和redis
    kafka是如何保证消息不被重复消费的
    kafka面试题及答案
    浅谈:2019 前端面试题
  • 原文地址:https://www.cnblogs.com/sabertobih/p/14043929.html
Copyright © 2020-2023  润新知