簡體   English   中英

在 Spark 中使用 jdbc 驅動程序連接到 Hive

[英]Connect to Hive with jdbc driver in Spark

我需要使用 Spark 將數據從遠程 Hive 移動到本地 Hive。 我嘗試使用 JDBC 驅動程序連接到遠程 hive:'org.apache.hive.jdbc.HiveDriver'。 我現在正在嘗試從 Hive 讀取結果是列值中的列標題而不是實際數據:

df = self.spark_session.read.format('JDBC') \
         .option('url', "jdbc:hive2://{self.host}:{self.port}/{self.database}") \
         .option('driver', 'org.apache.hive.jdbc.HiveDriver') \
         .option("user", self.username) \
         .option("password", self.password)
         .option('dbtable', 'test_table') \
         .load()
df.show()

結果:

+----------+
|str_column|
+----------+
|str_column|
|str_column|
|str_column|
|str_column|
|str_column|
+----------+

我知道 Hive JDBC 不是 Apache Spark 的官方支持。 但我已經找到了從其他不受支持的來源下載的解決方案,例如 IMB Informix。 也許有人已經解決了這個問題。

調試和跟蹤代碼后,我們會發現問題在 JdbcDialect。沒有 HiveDialect,所以 spark 將使用默認的 JdbcDialect.quoteIdentifier。所以你應該實現一個 HiveDialect 來解決這個問題:

import org.apache.spark.sql.jdbc.JdbcDialect

class HiveDialect extends JdbcDialect{
  override def canHandle(url: String): Boolean = 
    url.startsWith("jdbc:hive2")
  

  override def quoteIdentifier(colName: String): String = {
    if(colName.contains(".")){
      var colName1 = colName.substring(colName.indexOf(".") + 1)
      return s"`$colName1`"
    }
    s"`$colName`"
  }
}

然后通過以下方式注冊方言:

JdbcDialects.registerDialect(new HiveDialect)

最后,像這樣將選項 hive.resultset.use.unique.column.names=false 添加到 url

option("url", "jdbc:hive2://bigdata01:10000?hive.resultset.use.unique.column.names=false")

參考csdn博客

Apache Kyuubi 在這里提供了一個 Hive 方言插件。 https://kyuubi.readthedocs.io/en/latest/extensions/engines/spark/jdbc-dialect.html

Hive 方言插件旨在為 Spark 的 JDBC 源提供 Hive 方言支持。 它將自動注冊到 Spark 並應用於 url 前綴為jdbc:hive2://jdbc:kyuubi://的 JDBC 源。 它將以 Hive SQL 樣式引用標識符,例如。 引用 table.column in table column

  1. 編譯並從 Kyuubi 獲取方言插件。 (它是一個獨立的 Spark 插件,獨立於 Kyuubi)
  2. 將 jar 放入 $SPARK_HOME/jars
  3. 將插件添加到配置spark.sql.extensions=org.apache.spark.sql.dialect.KyuubiSparkJdbcDialectExtension ,它將自動注冊到 spark

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM