我正在使用 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 的输出。
对于工作SQL
scala> rddDF.first
res8: org.apache.spark.sql.Row = [Kushal]
对于非工作 SQL
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。请进一步建议。