我使用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一起工作。请进一步建议。
暂无答案!
目前还没有任何答案,快来回答吧!