在本人项目中涉及到spark相关读写问题,实际上我们项目做的是一个利用sparksql提高传统业务数据的流转速度的项目,使用hive中的数据并利用spark计算将数据回写入oracle。
本人使用的是spark 1.5的版本,内网操作,无法升级。
记录以下问题
1.使用oracle的原数据进行读,写入hive表
val conf=new SparkConf().setMaster(“local”).setAppName(“firstTry”)
val sc =new SparkContext(conf)
val sqlContext=new HiveContext(sc)
val jdbcDF1 =sqlContext.load(“jdbc”,Map(“url” -> “jdbc:oracle:thin:root/123456@//192.168.10.124:3306/orcl”,
“dbtable” -> "( select * from T_LG_GNLK ) ",
“driver” -> “oracle.jdbc.driver.OracleDriver”,
“numPartitions” ->“5”,
“partitionColumn”->“OBJECTID”,
“lowerBound”->“0”,
“upperBound”->“80000000”))
jdbcDF1.wirte.mode(“overwrite”).saveAsTable(“abb.T_LG_GNLK”)
val theDF=sqlContext.sql("select * from abb.T_LG_GNLK ")
theDF.take(10).foreach(println)
println(“成功加载!”)
sc.stop()
2.读hive的表,再写入oracle中
工程需要ojdbc14的依赖包
需要import java.util.Properties以及
import oracle.jdbc.driver.OracleDriver
val conf=new SparkConf().setMaster(“local”).setAppName(“firstTry”)
val sc =new SparkContext(conf)
val sqlContext=new HiveContext(sc)
val theDF=sqlContext.sql(“select * from abb.T_LG_GNLK” )
val url=" "
val table=" "
val connectProperties = new Properties()
connectProperties.put(“user”, “GSPWJC”)
connectProperties.put(“password”, “GSPWJC”)
connectProperties.put(“driver”,“oracle.jdbc.driver.OracleDriver”)
theDF.write.jdbc(url,table,connectProperties )
sc.stop()
其中给配置参数时可能会报错无法找到driver类,需要把ojdbc14的包通过
spark-submit --jars /opt/lib/ojdbc14.jar --class com.saw.bigdata.test1 /opt/bigdata/test/test.jar
进行配置方可解除错误。
3.利用oracle进行读写oracle的表
val conf=new SparkConf().setMaster(“local”).setAppName(“firstTry”)
val sc =new SparkContext(conf)
val sqlContext=new HiveContext(sc)
val jdbcDF1 =sqlContext.read.format(“jdbc”).options(Map(“url” -> “jdbc:oracle:thin:root/123456@//192.168.10.124:3306/orcl”,
“dbtable” -> "T_LG_GNLK ",
“driver” -> “oracle.jdbc.driver.OracleDriver”,
“numPartitions” ->“5”,
“partitionColumn”->“OBJECTID”,
“lowerBound”->“0”,
“upperBound”->“80000000”))
).load()
jdbcDF1 .write.format(“jdbc”).options(Map(
“dbtable” -> "T_LG_GNLK ",
“driver” -> “oracle.jdbc.driver.OracleDriver”,
“numPartitions” ->“5”,
“dbtable” -> "out_T_LG_GNLK ",
“partitionColumn”->“OBJECTID”,
“lowerBound”->“0”,
“upperBound”->“80000000”))
)).save()
sc.stop()
4.部分问题
在使用sparksql建立oracle表中,df.createjdbctable(url,table.false)该方式会报错无法找到driver,并不可取
使用hive去建立rdd再通过save的方式,会报错为not allow create table as select。无法使用sparksql来查询hive数据,利用select语句进行创建rdd,该方式也不可取。
其中还有一部分问题,是由于,多次读写parquet中临时表等多个落地表的schame语法有问题,导致读写可能会出错,使用打印语法,检查,部分字段需要cast
在spark中写入hive时float会自动转成timestamp,强制转成string类型即可解决