程序草图
- 我创建了一个HiveContext
hiveContext
- 在这个上下文中,我从JDBC关系表创建了一个DataFrame
df
- 我通过
df.registerTempTable("TESTTABLE")
注册数据帧df
- 我通过启动HiveThriftServer2
HiveThriftServer2.startWithContext(hiveContext)
TESTTABLE包含1000000个条目,列为ID(INT)和NAME(VARCHAR)
+-----+--------+
| ID | NAME |
+-----+--------+
| 1 | Hello |
| 2 | Hello |
| 3 | Hello |
| ... | ... |
使用Beeline,我访问HiveThriftServer的SQL端点(位于10000端口)并执行查询。例如
SELECT * FROM TESTTABLE WHERE ID='3'
当我检查执行SQL语句的DB的QueryLog时,我看到
/*SQL #:1000000 t:657*/ SELECT "ID","NAME" FROM test;
因此没有谓词下推,因为where子句丢失了。
问题
这引发了以下问题:
- 为什么不执行谓词下推
- 这可以通过不使用registerTempTable来改变吗
- 如果是,如何?还是这是HiveThriftServer的已知限制
反例
如果我在Spark SQLContext中创建一个DataFrame df
并调用
df.filter( df("ID") === 3).show()
我观察
/*SQL #:1*/SELECT "ID","NAME" FROM test WHERE ID = 3;
正如预期的那样。
现在回答可能为时已晚。在这种情况下,这不起作用,因为ID被定义为Int,而在原始查询中,您正在传递一个字符串('3')。谓词下推也查找相同的列名和类型。