我正在使用Cloudera JDBC Driver for Impala v 2.5.38和Spark 1.6.0来创建DataFrame。除了WITH子句之外,它适用于所有查询,但在我的组织中广泛使用WITH。 以下是我的代码段。
def jdbcHDFS(url:String,sql: String):DataFrame = {
var rddDF: DataFrame = null
val jdbcURL = s"jdbc:impala://$url"
val connectionProperties = new java.util.Properties
connectionProperties.setProperty("driver","com.cloudera.impala.jdbc41.Driver")
rddDF = sqlContext.read.jdbc(jdbcURL, s"($sql) AS ST", connectionProperties)
rddDF
}
下面给出了工作和非工作SQL的示例
val workingSQL = "select empname from (select * from employee) as tmp"
val nonWorkingSQL = "WITH tmp as (select * from employee) select empname from tmp"
以下是针对上述SQL的rddDF.first的输出。
for workingSQL
scala> rddDF.first
res8: org.apache.spark.sql.Row = [Kushal]
对于nonWorkingSQL
scala> rddDF.first
res8: org.apache.spark.sql.Row = [empname] //Here we are expecting actual data ie. 'Kushal' instead of column name like the output of previous query.
如果有人能为它提出任何解决方案,那将非常有用。
请注意:这两个查询在IMPALA-SHELL以及通过HUE的HIVE中都正常工作。
更新: 我试图设置普通的JDBC连接并执行nonWorkingSQL,它工作正常! 然后我认为这个问题是由于Spark在查询周围包含了一个“SELECT * FROM()”,因此我尝试使用下面的SQL来查找根本原因,但仍然可以工作并显示预期结果。
String sql = "SELECT * FROM (WITH tmp as (select * from employee) select empname from tmp) AS ST"
因此,根本原因尚不清楚,需要进行分析,以便它也适用于SPARK。请进一步建议。