在spark over JDBC上从远程配置单元读取数据返回空结果

时间:2017-06-08 11:20:25

标签: scala hadoop apache-spark jdbc hive

我需要从spark执行远程配置单元服务器上的配置单元查询,但由于某些原因,我只收到列名(没有数据)。 表中的数据,我通过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|
+-------+
+-------+

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

Scala版本:2.11 Spark版本:2.1.0,我也试过2.1.1 Hive版本:CDH 5.7 Hive 1.1.1,在HDP上我有相同的故事 Hive JDBC版本:1.1.1我也尝试过更高版本

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

2 个答案:

答案 0 :(得分:0)

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

 .option("fetchsize", "10")

答案 1 :(得分:0)

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()