处理spark查询hive时返回的结构全是列名的问题

import com.rmd.machinelearn.etl.EtlDataSql
import com.rmd.machinelearn.tools.{DateUtils, HiveUtil, RedisClusterClient}
import org.apache.spark.sql.jdbc.{JdbcDialect, JdbcDialects}
import org.apache.spark.sql.{DataFrame, SparkSession}
import org.apache.spark.{SparkConf, SparkContext}
import redis.clients.jedis.params.ScanParams

import java.sql.{Connection, Statement}
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
import java.time.temporal.TemporalAdjusters
import java.time.temporal.WeekFields
import java.util.Locale
import java.util.stream.IntStream
import scala.io.Source
import scala.jdk.CollectionConverters._
object a {
  object HiveSqlDialect extends JdbcDialect {
    //
    override def canHandle(url: String): Boolean = {
      url.toLowerCase(Locale.ROOT).startsWith("jdbc:hive2")
      //    url.startsWith("jdbc:hive2")
      //mysql   url.toLowerCase(Locale.ROOT).startsWith("jdbc:mysql")
    }

    override def quoteIdentifier(colName: String): String = {
      colName.split('.').map(part => s"`$part`").mkString(".")
      // mysql   s"`$colName`"
    }
  }


  object RegisterHiveSqlDialect {
    def register(): Unit = {
      JdbcDialects.registerDialect(HiveSqlDialect)
    }
  }

  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder()
      .appName("Hive Example")
      .master("local[*]")
      .enableHiveSupport()
      .getOrCreate()

    import spark.implicits._

    RegisterHiveSqlDialect.register()
    val connectionProperties = new java.util.Properties()
    connectionProperties.put("user", "hadoop")
    connectionProperties.put("password", "hadoop")
    connectionProperties.put("driver", "org.apache.hive.jdbc.HiveDriver")

    val query = "(SELECT vodname, vodid FROM vodid) AS voddata"
    val jdbcDF: DataFrame = spark.read.jdbc("jdbc:hive2://0.0.0.0:10000/test", query, connectionProperties)
    jdbcDF.show()
//
//    // 关闭SparkSession
//    spark.stop()

//    var stmt: Statement = null
//    var conn: Connection = null
//    try {
//      conn = HiveUtil.getInstance().getConnection
//      stmt = conn.createStatement()
//      val rs = stmt.executeQuery("SELECT vodname, vodid FROM test.vodid")
//      while (rs.next()){
//        println(rs.getString(1))
//      }
//    } catch {
//      case e: Exception => e.printStackTrace()
//    } finally {
//      if (null != stmt) {
//        stmt.close()
//      }
//      if (null != conn) {
//        conn.close()
//      }
//    }
  }

}
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值