带有Impala的Cloudera JDBC驱动程序的WITH子句问题 - 返回列名而不是实际数据

时间:2017-08-09 14:08:43

标签: hadoop apache-spark jdbc cloudera impala

我正在使用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。请进一步建议。

0 个答案:

没有答案