impala的cloudera jdbc驱动程序的with子句问题-返回列名而不是实际数据

a64a0gku  于 2021-05-29  发布在  Hadoop
关注(0)|答案(0)|浏览(273)

我使用cloudera jdbc驱动程序impalav2.5.38和spark1.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 壳以及通过色调的Hive中都可以正常工作。
更新:我试着设置普通的jdbc连接并执行非工作sql,结果成功了!然后我认为问题是由于spark在查询周围 Package 了一个“select*from()”,因此我尝试了下面的sql来查找根本原因,但它仍然有效并显示了预期的结果。

String sql  = "SELECT * FROM (WITH tmp as (select * from employee) select empname from tmp) AS ST"

因此,根本原因尚不清楚,需要对其进行分析,以便它也能与spark一起工作。请进一步建议。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题