spark postgresql查询后hive批量写入

一.功能说明

从传统数据库中读取数据,然后一次性插入至hive表中.

二.代码详细

    val sc = new SparkContext(new SparkConf())
    val sqlContext = new SQLContext(sc)

    val schema = StructType(List(
      StructField("branch_no", StringType, true),//StructField("branch_no", DecimalType(), true),
      StructField("broker_account", StringType, true),
      StructField("broker_name", StringType, true),
      StructField("broker_type", StringType, true),
      StructField("client_branch_no", StringType, true),
      StructField("client_id", StringType, true),
      StructField("client_name", StringType, true),
      StructField("client_status", StringType, true),
      StructField("broker_status", StringType, true)
    ))
    val url = "jdbc:postgresql://10.2.22.222:5432/iris_test?user=iris&password=test123"

    logInfo("读取pg库数据```开始")
    val tableDataFrame = sqlContext.load("jdbc",Map(
    "url" -> url,
    "driver" -> "org.postgresql.Driver",
    "dbtable" -> "broker_test"
    ))
    tableDataFrame.registerTempTable("iris_table")
    val tableRdd = sqlContext.sql("select * from iris_table").rdd
      /*.map(
      p => Row(
        p(0).asInstanceOf[Int]
        p(1).toString,
        p(2).toString,
        p(3).toString
      )
    )*/
    //上面代码可以针对某些类型做转换
    logInfo("读取pg库数据```完成")

    logInfo("插入hive```开始")
    val hiveCtx = new HiveContext(sc)
    val temp = hiveCtx.createDataFrame(tableRdd,schema)
    temp.registerTempTable("tempTable")
    val hiveDb = "testDb"
    hiveCtx.sql(s"USE $hiveDb")
    hiveCtx.sql("insert into broker_test_t select * from tempTable")
    logInfo("插入hive```完成")

三.常见问题

1.权限问题
可能会报hadoop.security.AccessControlException
原因是这个表你没有写入权限.
所以在插入前,一定要先确认你是否有写入权限
2.类型匹配出错
这个问题基本都是自己在定义字段类型的时候不仔细
带上一份写的不错的文章,建议看看:Spark(Hive) SQL数据类型使用详解

如有其他问题,欢迎回复.

如此文章对你有帮助,欢迎留言点赞.谢谢.

你可能感兴趣的:(spark)