Scala 为什么谓词下推不起作用? 程序草图 我创建了一个HiveContextHiveContext 在这个上下文中,我从JDBC关系表创建了一个DataFramedf 我通过df.registerTempTable(“TESTTABLE”)注册数据帧df 我通过启动HiveThriftServer2 HiveThriftServer2.startWithContext(hiveContext)

Scala 为什么谓词下推不起作用? 程序草图 我创建了一个HiveContextHiveContext 在这个上下文中,我从JDBC关系表创建了一个DataFramedf 我通过df.registerTempTable(“TESTTABLE”)注册数据帧df 我通过启动HiveThriftServer2 HiveThriftServer2.startWithContext(hiveContext),scala,apache-spark,predicate,apache-spark-sql,Scala,Apache Spark,Predicate,Apache Spark Sql,TESTTABLE包含1000000个条目,列为ID(INT)和NAME(VARCHAR) 使用Beeline,我访问HiveThriftServer的SQL端点(在端口10000处)并执行查询。例如 SELECT * FROM TESTTABLE WHERE ID='3' 当我用执行的SQL语句检查DB的QueryLog时,我看到 /*SQL #:1000000 t:657*/ SELECT \"ID\",\"NAME\" FROM test; 因此没有谓词下推,因为缺少where子句

TESTTABLE包含1000000个条目,列为ID(INT)和NAME(VARCHAR)

使用Beeline,我访问HiveThriftServer的SQL端点(在端口10000处)并执行查询。例如

SELECT * FROM TESTTABLE WHERE ID='3'
当我用执行的SQL语句检查DB的QueryLog时,我看到

/*SQL #:1000000 t:657*/  SELECT \"ID\",\"NAME\" FROM test;
因此没有谓词下推,因为缺少where子句

问题 这就提出了以下问题:

  • 为什么不执行谓词下推
  • 不使用RegisterEmptable可以改变这一点吗
  • 如果是,怎么做?或者这是HiveThriftServer的已知限制
反例 如果我在Spark SQLContext中创建一个数据帧
df
,并调用

df.filter( df("ID") === 3).show()
我观察到

/*SQL #:1*/SELECT \"ID\",\"NAME\" FROM test WHERE ID = 3;

正如所料。

现在回答可能太晚了。
在这个场景中,这不起作用,因为ID被定义为Int,并且在原始查询中传递了一个字符串('3')。谓词下推查找相同的列名和类型。

是否尝试在数据帧筛选器上执行解释计划?过滤器(…)。解释(正确)哦,很好的提示。我会试试的!!!好的,我明白了。我不确定蜂巢思维中是否有类似的过程。对不起,我还没有深入了解第三英尺和蜂巢的具体情况。在第一个案例中,我仍然无法帮助您,非常感谢您的帮助。
EXPLAIN SELECT*FROM TESTTABLE WHERE ID='3'
应该可以工作,尽管我怀疑它是否有用。我在本地模式下尝试了Spark 1.5.1,默认设置与PostgreSQL 9.4相结合,简单谓词按预期向下推。
/*SQL #:1*/SELECT \"ID\",\"NAME\" FROM test WHERE ID = 3;