spark中SQL解析函数的使用

Posted

技术标签:

【中文标题】spark中SQL解析函数的使用【英文标题】:Use of SQL analytic function from spark 【发布时间】:2015-05-19 19:34:59 【问题描述】:

我有如下 SQL

SELECT LIMIT, 
       COL1, 
       COL2, 
       COL3
 FROM   
(SELECT ROW_NUMBER () OVER (ORDER BY COL5 DESC) AS LIMIT, 
        FROM_UNIXTIME(COL_DATETIME,'dd-MM-yyyy HH24:mi:ss') COL1,
        CASE WHEN COL6 IN ('A', 'B') THEN A_NUMBER ELSE B_NUMBER END AS COL2, 
        COL3
 FROM   DBNAME.TABLENAME 
WHERE   COL7 LIKE ('123456%')  
  AND   COL_DATETIME BETWEEN 20150201000000 AND 20150202235959) X

我可以从 hive 成功执行它。但我想从火花中执行它。我创建了一个如下所示的 spark-sql-hive 上下文

scala> val sqlHContext = new org.apache.spark.sql.hive.HiveContext(sc)
sqlHContext: org.apache.spark.sql.hive.HiveContext = org.apache.spark.sql.hive.HiveContext@71138de5

然后我尝试像下面这样执行上面的 sql 查询

sqlHContext.sql("SELECT LIMIT, COL1, COL2, COL3 FROM (SELECT ROW_NUMBER () OVER (ORDER BY COL5 DESC) AS LIMIT, FROM_UNIXTIME(COL_DATETIME,'dd-MM-yyyy HH24:mi:ss') COL1, CASE WHEN COL6 IN ('A', 'B') THEN A_NUMBER ELSE B_NUMBER END AS COL2, COL3 FROM DBNAME.TABLENAME WHERE  COL7 LIKE ('123456%')  AND COL_DATETIME BETWEEN 20150201000000 AND 20150202235959) X").collect().foreach(println)

但得到错误

org.apache.spark.sql.AnalysisException: 
Unsupported language features in query:


scala.NotImplementedError: No parse rules for ASTNode type: 882, text: TOK_WINDOWSPEC :
TOK_WINDOWSPEC 1, 90,98, 339
  TOK_PARTITIONINGSPEC 1, 91,97, 339
    TOK_ORDERBY 1, 91,97, 339
      TOK_TABSORTCOLNAMEDESC 1, 95,97, 339
        TOK_TABLE_OR_COL 1, 95,95, 339
          CALL_DATETIME 1, 95,95, 339
" +
         
org.apache.spark.sql.hive.HiveQl$.nodeToExpr(HiveQl.scala:1261)

似乎不支持分析功能。我使用的是火花版本 1.3.0; hive 版本 1.1.0 和 hadoop 版本 2.7.0

还有其他方法可以通过 spark 实现吗?

【问题讨论】:

这可以通过使用不同的spark命令并考虑文件中的表数据来实现吗 【参考方案1】:

从 Spark 1.4.0 开始支持窗口函数。还有一些限制,例如ROWS BETWEEN 尚不支持。例如,请查看Spark window functions 上的这篇博文。

【讨论】:

以上是关于spark中SQL解析函数的使用的主要内容,如果未能解决你的问题,请参考以下文章

Spark Hive自定义函数使用解析

如何在 Spark Databricks 中注册 SQL 函数

pyspark在spark sql中函数之间的使用范围

Spark基础学习笔记29:Spark SQL内置函数

Spark SQL内置函数

在 SQL/Spark 中使用窗口函数执行特定过滤器