程序草图
- 我创建一个 HiveContext
hiveContext
.
- 有了这个背景,我创建了一个 DataFrame
df
来自 JDBC 关系表。
- 我注册数据框
df
via df.registerTempTable("TESTTABLE")
.
- 我通过启动 HiveThriftServer2
HiveThriftServer2.startWithContext(hiveContext)
.
测试表包含 1,000,000 个条目,列是 ID (INT) 和 NAME (VARCHAR)
+-----+--------+
| ID | NAME |
+-----+--------+
| 1 | Hello |
| 2 | Hello |
| 3 | Hello |
| ... | ... |
我使用 Beeline 访问 HiveThriftServer 的 SQL 端点(端口 10000)并执行查询。例如。
SELECT * FROM TESTTABLE WHERE ID='3'
当我检查数据库的查询日志以及执行的 SQL 语句时,我看到
/*SQL #:1000000 t:657*/ SELECT \"ID\",\"NAME\" FROM test;
因此,由于缺少 where 子句,因此不会发生谓词下推。
问题
这引发了以下问题:
- 为什么不执行谓词下推?
- 不使用registerTempTable 可以改变这一点吗?
- 如果是这样,怎么办?或者这是 Hive ThriftServer 的已知限制?
反例
如果我创建一个 DataFramedf
在 Spark SQLContext 中并调用
df.filter( df("ID") === 3).show()
我观察到
/*SQL #:1*/SELECT \"ID\",\"NAME\" FROM test WHERE ID = 3;
正如预期的那样。