为什么谓词下推不起作用



程序草图

  • 我创建了一个HiveContext hiveContext
  • 在这个上下文中,我从JDBC关系表创建了一个DataFrame df
  • 我通过df.registerTempTable("TESTTABLE")注册数据帧df
  • 我通过启动HiveThriftServer2HiveThriftServer2.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')。谓词下推也查找相同的列名和类型。

相关内容

  • 没有找到相关文章

最新更新