我需要从 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中回答了这个问题。这是解决方案:
-
创建一个使用正确的引号转义列名称的 Hive 方言:
object HiveDialect extends JdbcDialect { override def canHandle(url: String): Boolean = url.startsWith("jdbc:hive2") override def quoteIdentifier(colName: String): String = s"`$colName`" }
-
在拨打 spark.read.jdbc 之前注册它
JdbcDialects.registerDialect(HiveDialect)
-
使用 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")