为什么谓词下推不起作用?

时间:2015-11-01 12:58:50

标签: scala apache-spark predicate apache-spark-sql

程序草图

  • 我创建了一个HiveContext hiveContext
  • 使用该上下文,我从JDBC关系表创建一个DataFrame df
  • 我通过df注册了DataFrame df.registerTempTable("TESTTABLE")
  • 我通过启动HiveThriftServer2 HiveThriftServer2.startWithContext(hiveContext)

TESTTABLE包含1,000,000个条目,列是ID(INT)和NAME(VARCHAR)

+-----+--------+
| ID  |  NAME  |
+-----+--------+
| 1   | Hello  |
| 2   | Hello  |
| 3   | Hello  |
| ... | ...    |

使用Beeline我访问HiveThriftServer的SQL端点(在端口10000)并执行查询。 E.g。

SELECT * FROM TESTTABLE WHERE ID='3'

当我用执行的SQL语句检查数据库的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;

正如所料。

1 个答案:

答案 0 :(得分:0)

回答可能为时已晚。 在这种情况下,此操作不起作用,因为ID定义为Int,并且在原始查询中您正在传递字符串('3')。谓词下推也会查找相同的列名称和类型。