通过 JDBC 从 Spark 上的远程配置单元读取数据返回空结果



我需要从 Spark 在远程 Hive 服务器上执行 Hive 查询,但由于某些原因,我只收到列名(没有数据(。表中可用的数据,我通过 HUE 和 java jdbc 连接进行了检查。

这是我的代码示例:

val test = spark.read
    .option("url", "jdbc:hive2://remote.hive.server:10000/work_base")
    .option("user", "user")
    .option("password", "password")
    .option("dbtable", "some_table_with_data")
    .option("driver", "org.apache.hive.jdbc.HiveDriver")
    .format("jdbc")
    .load()
test.show()

输出:

+-------+
|dst.col|
+-------+
+-------+

我知道这张桌子上有可用的数据。

斯卡拉版本:2.11Spark版本:2.1.0,我也尝试了2.1.1蜂巢版本:CDH 5.7 蜂巢 1.1.1,在 HDP 上我有同样的故事Hive JDBC版本:1.1.1我也尝试了更高版本

但是这个问题在更高版本的Hive上也可用。你能帮我解决这个问题吗,因为我在邮件组答案和 StackOverflow 中没有找到任何东西。也许您知道如何执行从 Spark 到远程服务器的 Hive 查询?

Paul Staab在Spark jira中回答了这个问题。这是解决方案:

  1. 创建一个使用正确的引号转义列名称的 Hive 方言:

    object HiveDialect extends JdbcDialect {
        override def canHandle(url: String): Boolean = url.startsWith("jdbc:hive2")
        override def quoteIdentifier(colName: String): String = s"`$colName`"
    }
    
  2. 在拨打 spark.read.jdbc 之前注册它

    JdbcDialects.registerDialect(HiveDialect)
    
  3. 使用 fetchsize 选项执行 spark.read.jdbc

    spark.read.jdbc("jdbc:hive2://localhost:10000/default","test1",properties={"driver": "org.apache.hive.jdbc.HiveDriver", "fetchsize": "10"}).show()
    

您应该将其添加到您的选项中:

 .option("fetchsize", "10")

最新更新