用spark从oracle导入数据到hive

大概步骤:java

  1. 链接oracle,建立一个dataframe用来接收从oracle里面读取的数据。
  2. 将dataframe的数据写入临时表。
  3. 用hiveContext.sql语句将数据写入hive里面。

这个程序其实对于学了spark的人来讲很简单,直接上代码吧:sql

  package com.ctbri.cgs.oracle2Hive
    
    import org.apache.spark.sql.SparkSession
    import org.apache.spark.sql.types._
    import java.util.Properties
    import scala.collection.mutable.ArrayBuffer
    import org.apache.spark.sql.functions._
    
    object App {
      
      def main(args: Array[String]):Unit = {
              //建立一个sparkcontext对象,用enableHiveSupport获取了对HIVE的支持
            val spark = SparkSession
            .builder()
            .appName("Oracle2Hive")
            .master("local")
            .config("spark.port.maxRetries","128")
            .config("spark.sql.parquet.writeLegacyFormat",true)
            .enableHiveSupport()
            .getOrCreate()
    
            //链接oracle
            val jdbcDF = spark.read.format("jdbc").options(
            Map(
            "driver" -> "oracle.jdbc.driver.OracleDriver",
            "url" -> "url路径",
            "user" -> "username",
            "password" -> "password",
            "dbtable" -> "要导出的数据表名"
            )).load()
       
            //须要转换的列名
            val colName = ArrayBuffer[String]()
            val schema = jdbcDF.schema.foreach(s => {
              if (s.dataType.equals(DecimalType(38, 10)) || s.dataType.equals(DecimalType(4, 0))) {
                colName += s.name
              }
            })
            
            //字段类型转换
            var df_int = jdbcDF
            colName.foreach(name => {
              df_int = df_int.withColumn(name, col(name).cast(IntegerType))
            })
           
            //建立临时表 
            jdbcDF.createOrReplaceTempView("records")
           
            spark.sql("use 库名")
            spark.sql("set hive.exec.dynamic.partition.mode=nonstrict")
            jdbcDF.write.mode("overwrite").saveAsTable("表名")
            }
    }
其中须要注意的就是,我第一次写的时候,没有进行字段类型的转换,致使数据能够导入,在hive里面也能够查看表属性,可是没法查出具体数据,缘由就是spark导入的时候,将oracle的number类型转换成了decimal类型,致使没法查看,其余诸如data,char等都是成功的,进行一下类型转换就能够了。
文章及代码内容参考了https://blog.csdn.net/dkl12/article/details/82347534
 apache