• spark读写Oracle、hive的艰辛之路(一)


    前两天工作需求,要通过给的几个Oracle的视图把数据入到hive库中,很遗憾,使用的华为云平台的集区环境中并没有sqoop1,当然也并没有sqoop2,所以,想到的解决方案是使用spark读取Oracle在写入到hive表中;

    1、首先,沟通了一个星期的数据库接口,是的,就是一个星期;拿到的结果为 10.111.50.7:1521/DB2,当然,数据库ip和服务名是我乱写的一个,格式是这样的;

      还附带了一条查询语句:select * from jzwh.ALARMS 就完了,这就完了?事实上并不是,在生产环境中但凡提到有ip,端口,就要考虑有没有防火墙的问题,我们这里是有的。。

      一般都会有的,当然这不属于开发的任务,需要相关同事提交申请,不累述了;

    2、拿到接口之后代码如下:注:我使用的版本为spark 2.1.0,scala 2.11.8;spark2.0之前没有sparksession,2.0之前的版本的同学还请自行使用hiveContext

    object dy_alarm_oracle2hive {
      val spark = SparkSession.builder().appName("view2hive")
        .enableHiveSupport().getOrCreate()
    
      import spark.sql
    
      def main(args: Array[String]): Unit = {
    
        OracleDateTypeInit.oracleInit()
        val orclUrl = "jdbc:oracle:thin:@//10.111.11.1:1521/DYDB2";//用ip不用加@
        val orclProperties = new Properties()
        orclProperties.setProperty("user", "user")
        orclProperties.setProperty("password", "password")
        orclProperties.setProperty("driver", "oracle.jdbc.driver.OracleDriver")
    
        val predicates_day_hour = mk_predicates_day_hour()
    
        //表名可以使用子查询的方式
        val table_name = s"(select * from jzwh.ALARM union all select * from jzwh.ALARM_history) a"
    
        spark.read.jdbc(orclUrl,table_name,predicates_day_hour,orclProperties)
          .createOrReplaceTempView("ALARMS")
    
        insertTable("bx_alarm")
     }
    
      def insertTable(table_name:String): Unit ={
        val day = TimeTools.getTimeByNowDay(-1)
        sql(
          s"""
             |insert overwrite table ${table_name} partition(p_day=${day})
             |select *
             | from ALARMS
          """.stripMargin)
      }
    
      def mk_predicates_day_hour():scala.Array[scala.Predef.String] = {
        val day_1 = TimeTools.getTimeByNowDay_(-1)
        val day = TimeTools.getTimeByNowDay_(0)
        /*返回值例子:
        *EVENTTIME >= to_date('2018-08-07 00','YYYY-MM-dd HH24') and EVENTTIME < to_date('2018-08-07 01','yyyy-MM-dd HH24')
        * 注意判断23点到第二天的00点特殊情况
        * */
        val predicates_day_hour = (0 to 23).map {
          i => {
            if(i < 23){
              (if (i < 10) s"${day_1} 0${i}" else s"${day_1} ${i}") -> (if ((i + 1) < 10) s"${day_1} 0${i + 1}" else s"${day_1} ${i + 1}")
            }else{
              s"${day_1} 23" -> s"${day} 00"
            }
          }
        }.map{
          case (start,end) => s" EVENTTIME >= to_date('${start}','YYYY-MM-dd HH24') and EVENTTIME < to_date('${end}','yyyy-MM-dd HH24')"
        }.toArray
        //返回scala.Array[scala.Predef.String]类型结果
        predicates_day_hour
      }
    
    }

    使用到的几个工具类:

    也是网上找的;

    TimeTools :获取日期的工具类
    public class TimeTools {
        //获取当前时间的前后几个小时
        public static String getTimeByHour(int hour) {
            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY) + hour);
            return new SimpleDateFormat("yyyy-MM-dd HH").format(calendar.getTime());
        }
    
        //获取当前日期
        public static String getTimeByNowDay(int day) {
            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) + day);
            return new SimpleDateFormat("yyyyMMdd").format(calendar.getTime());
        }
        //获取当前日期
        public static String getTimeByNowDay_(int day) {
            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) + day);
            return new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime());
        }
    
        //获取当前时间的前后几分钟
        public static String getTimeByMinute(int minute) {
            Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.MINUTE, minute);
            return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime());
        }
    }
    
    
  • 相关阅读:
    20165334 我期待的师生关系
    20165228 我期望的师生关系
    20165232 预备作业3 Linux安装及学习
    20165232 学习基础和c语言基础调查
    20165232 我期望的师生关系
    20165320 第一周学习总结
    20165320 预备作业3 :Linux安装及命令入门
    20165320 预备作业2:技能学习心得与C语言学习
    20165320 我期望的师生关系
    20165203 学习基础和C语言基础调查
  • 原文地址:https://www.cnblogs.com/zuizui1204/p/9456793.html
Copyright © 2020-2023  润新知