spark读取oracle的

来源:互联网 发布:部落冲突咏王升级数据 编辑:程序博客网 时间:2024/05/16 05:27

刚开始使用spark-sql,首先看了一部分的源码。然后开始着手程序的编写。
在spark中使用jdbc:
在 Spark-env.sh 文件中加入:
export SPARK_CLASSPATH=
任务提交时加入:
spark-submit –master spark://master:7077 –jars ojdbc16.jar

一、
val rdd = sqlContext.read.format(“jdbc”).options(
Map(“url” ->”jdbc:oracle:thin:@192.168.1.110:1521:orcl”,”user”->”root”,”password”->”123456”,
“dbtable” -> s”( select fielsfromsourceDBName ) a”, “driver” -> driver,
“numPartitions” ->”14”)).load().cache()
jdbcDF.rdd.partitions.size = 1
此时无论你的numPartitions的值为多大,实际的partitions只有一个分区,
该操作的并发度为1,你所有的数据都会在一个partition中进行操作,意味着无论你给的资源有多少,只有一个task会执行任务,执行效率可想而之,并且在稍微大点的表中进行操作分分钟就会OOM。
当我用该方法时,并发度为1,记得当时读取的数据是8000W条数据,一直卡着,一会儿出现OOM。经过查看官网的sparksql部分,发现了该方法也可以指定字段分区。
val jdbcDF = sqlContext.read.format(“jdbc”).options(
Map(“url” -> “jdbc:oracle:thin:root/123456@//192.168.1.110:1521/orcl”,
“dbtable” -> “( select * from T_LG_GNLK ) a”, “driver” -> “oracle.jdbc.driver.OracleDriver”,
“numPartitions” ->”5”,”partitionColumn”->”OBJECTID”,”lowerBound”->”0”,”upperBound”->”80000000”)).load()
val size= jdbcDF.rdd.partitions.size
此时size = 5;虽然现在的分区为5,但是前几个task根本就没有读取数据,知道最后一个分区卡主,此时数据读出来全部集中在一个台机器,当时加班已经到凌晨2点了,当时意识也模糊了,看了会儿源码,碎叫去了。到第二天,才突然发现自己犯了一个比较严重的错误,握草,然后开始修改lowerBound和upperBound的值,这是发现前几个task开始读取数据了。握草,我犯了一个太低级的错误,在此偷偷的抽了自己一嘴巴。
在此过程中发现了spark1.4的一个小bug,就是下面的描述
jdbcDF: org.apache.spark.sql.DataFrame = [ID:decimal(0,-127), XX: string, XX: string, XX: string, XX: decimal(0,-127)]
注意:在1.6以前的版本中,当Oracle表字段为Number时,对应DataType为decimal,此时会由于scala的精度断言抛出异常——可以在stackoverflow网站查找该异常——应该是个bug,在1.6中应该已经解决。有兴趣可以试下下。——如果继续show数据的话,会抛出该异常。
二、
def getConnection() = {
Class.forName(“oracle.jdbc.driver.OracleDriver”).newInstance()
DriverManager.getConnection(“jdbc:oracle:thin:@192.168.1.116:1521:orcl”, “root”, “12
3456”)
}
val rdd = new JdbcRDD(sc,getConnection,
“SELECT * FROM table WHERE ? <= ID AND ID <= ?”,
Long.MinValue, Long.MaxValue, 2 ,(r: ResultSet) => { r.getInt(“id”)+”\t”+r.getString(“name”)}
)
该方法是很久之前的API了,现在的新版本中有了更好的方法。即上面提到的方法1。

以上的方法都是依据分区的列必须是number类型的,否则java.lang.NumberFormatException: For input string: “A”
根据Long类型字段分区,此时一定要选择好上下界,要不然很可能很多空的partition的。
三、根据任意类型字段分区
jdbc(
url: String,
table: String,
predicates: Array[String],
connectionProperties: Properties): DataFrame

val part =
Array(
“2016-01-01” -> “2016-02-01”,
“2016-02-01” -> “2016-03-01”,
“2016-03-01” -> “2016-04-01”,
“2016-04-01” -> “2016-05-01”,
“2016-05-01” -> “2016-06-01”,
“2016-06-01” -> “2016-12-30”
).map {
case (start, end) =>
s”cast(RZSJ as date) >= date ‘start"+s"ANDcast(RZSJasdate)<=dateend’”
}
val driver1: String = “oracle.jdbc.driver.OracleDriver”
val props1 = new Properties()
props1.setProperty(“user”, “root”)
props1.setProperty(“password”, “123456”)
props1.setProperty(“driver”, driver)
val dataf = sqlContext.read.jdbc(“jdbc:oracle:thin:root/123456@192.168.0.33:1521/orcl”,”table1”,part,props)

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微信退出后重新登录忘记密码怎么办 微退出后再登录忘记密码了怎么办 忘记微信密码又退出微信怎么办 无线网自家密码忘了也连不上怎么办 无线网密码忘了连接不上怎么办 魅蓝手机插口半夜坏了怎么办 魅族手机换屏后出现跳屏怎么办 小米手机微信小程序转发不出怎么办 苹果手机ad码和密码忘了怎么办 魅族手机摔掉无法开机怎么办 魅族音量+电源键直接开机了怎么办 魅蓝2数字锁机了怎么办 苹果5s蓝屏开不了机怎么办 红米pro更新开发版发热卡怎么办 5s手机音量增大键失灵怎么办 眼睛看手机久了模糊应怎么办 华为无线自拍杆连opp手机怎么办 苹果手机进水后自动跳电怎么办 魅族手机返回键不好使怎么办 手机壳是玻璃的摔坏了怎么办 魅族手机进水了开不了机怎么办 打发票机屏忘记了密码怎么办 魅族手机升级显示电量不足怎么办 魅蓝手机的图库没了怎么办 魅蓝5s屏幕碎了怎么办 魅族手机中间的home键失灵怎么办 魅族手机突然关机开不了机了怎么办 魅蓝3s卡顿怎么办视频 魅蓝3s手机太卡怎么办 红米4x外放破音怎么办 魅族手机刷机后内存变小了怎么办 手机用久了内存越来越小怎么办魅族 贴了车膜左右后视镜反光怎么办 贴手机膜时酒精没了怎么办 魅蓝e外屏幕碎了怎么办 贴的手机膜边缘翘起来着怎么办 手机后面贴的膜都是胶怎么办 车漆外面一层保护膜被划开了怎么办 美团骑手gps信号弱时怎么办 华为荣耀4x充电插口坏了怎么办 华为畅享5s开不了机怎么办