前两天工作需求,要通过给的几个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());
}
}
												

spark读写Oracle、hive的艰辛之路(一)的更多相关文章

  1. spark读写Oracle、hive的艰辛之路(二)-Oracle的date类型

    近期又有需求为:导入Oracle的表到hive库中: 关于spark读取Oracle到hive有以下两点需要说明: 1.数据量较小时,可以直接使用spark.read.jdbc(orclUrl,tab ...

  2. Spark 读写hive 表

    spark 读写hive表主要是通过sparkssSession 读表的时候,很简单,直接像写sql一样sparkSession.sql("select * from xx") 就 ...

  3. 大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 图文详解

    引言 在之前的大数据学习系列中,搭建了Hadoop+Spark+HBase+Hive 环境以及一些测试.其实要说的话,我开始学习大数据的时候,搭建的就是集群,并不是单机模式和伪分布式.至于为什么先写单 ...

  4. HADOOP+SPARK+ZOOKEEPER+HBASE+HIVE集群搭建(转)

    原文地址:https://www.cnblogs.com/hanzhi/articles/8794984.html 目录 引言 目录 一环境选择 1集群机器安装图 2配置说明 3下载地址 二集群的相关 ...

  5. spark2.3.0 配置spark sql 操作hive

    spark可以通过读取hive的元数据来兼容hive,读取hive的表数据,然后在spark引擎中进行sql统计分析,从而,通过spark sql与hive结合实现数据分析将成为一种最佳实践.配置步骤 ...

  6. 使用Spark读写CSV格式文件(转)

    原文链接:使用Spark读写CSV格式文件 CSV格式的文件也称为逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号.在本文中的CSV格 ...

  7. Spark读写ES

    本文主要介绍spark sql读写es.structured streaming写入es以及一些参数的配置 ES官方提供了对spark的支持,可以直接通过spark读写es,具体可以参考ES Spar ...

  8. Oracle/Hive/Impala SQL比较1

    5 Function      指数据库内置的function,不讨论UDF.另外,操作符都不比较了,区别不大.   5.1 数学函数 功能 Oracle Hive Impala ABS 绝对值,有 ...

  9. Spark读写HBase

    Spark读写HBase示例 1.HBase shell查看表结构 hbase(main)::> desc 'SDAS_Person' Table SDAS_Person is ENABLED ...

随机推荐

  1. Excel 如何统计非空非零单元格的个数

    使用 Excel 统计非空非零单元格的个数: ——使用函数 :=COUNTIFS($B$2:$B$194440,"<>",$B$2:$B$194440,"&l ...

  2. Docker学习-从无知到有知的学习过程

    Docker学习 最近被别人提到的docker吸引到了注意力,所以打算先快速的了解一下docker到底是个上面东西. 之所以我写下这个文档呢,是为了记录对docker一无所知我是如何进行学习一门新技术 ...

  3. 读《PMI 分析手册》

    目录 读<PMI 分析手册> 官方 PMI 基本概况 官方制造业 PMI 官方非制造业 PMI 综合 PMI 产出指数 PMI 分析框架 PMI 与经济周期 官方 PMI 分析 参考研报 ...

  4. python迭代有限制,突破限制

    python默认迭代次数为996 需要修改才能迭代超过996 import sys sys.setrecursionlimit() #自定义扩展极限,可以自己改 def fun(n): print(n ...

  5. Linux之三剑客

    LINUX之三剑客 本篇主要介绍linux下常用的增删改查工具: grep sed awk grep是linux下一个强大的搜索工具,几乎操作linux的用户每天都会或多或少的用到grep命令,单一个 ...

  6. 【Python + Selenium3】自动化测试之DDT数据驱动并生成测试报告以及用yagmail邮件发送文件

    我的文件路径 一.DDT代码: import unittest from time import sleep from selenium import webdriver from ddt impor ...

  7. Springboot Actuator之七:actuator 中原生endpoint源码解析1

    看actuator项目的包结构,如下: 本文中的介绍Endpoints. Endpoints(端点)介绍 Endpoints 是 Actuator 的核心部分,它用来监视应用程序及交互,spring- ...

  8. 【chromium】 Chromium OS的oom机制

    前一段时间,运行在Chromium OS上的一个相机应用经常会自己崩溃,进程戛然而止,测试过程中发现使用的内存以肉眼可见的内存增长,当增长到1G左右,应用窗口突然消失,虽然原因不明,但是能猜到个大概, ...

  9. PowerBuilder学习笔记之2PowerScript语言(一)

    教材链接:https://wenku.baidu.com/view/1e82d26925c52cc58ad6be05.html?sxts=1565679996440 2.1PowerScript基础 ...

  10. Java学习:Set接口与HashSet集合存储数据的结构(哈希表)

    Set接口 java.util.Set接口 extends Collection接口 Set接口的特点: 不允许存储重复的元素 没有索引,没有带索引的方法,也不能使用普通的for循环遍历 java.u ...