SparkSQL-Lag函数?

SparkSQL-Lag函数?,sql,apache-spark,pyspark,apache-spark-sql,window-functions,Sql,Apache Spark,Pyspark,Apache Spark Sql,Window Functions,我在这里看到,SparkSql中支持窗口函数,特别是我尝试使用lag()窗口函数 我有几行信用卡交易,我已经对它们进行了排序,现在我想迭代这些行,并为每一行显示交易金额,以及当前行金额和前一行金额的差异 在DataBricks的帖子之后,我提出了这个查询,但它向我抛出了一个异常,我不能完全理解为什么 这是Pypark。。tx是已在注册为临时表时创建的数据帧 test =sqlContext.sql("SELECT tx.cc_num,tx.trans_date,tx.trans_time,tx.

我在这里看到,SparkSql中支持窗口函数,特别是我尝试使用lag()窗口函数

我有几行信用卡交易,我已经对它们进行了排序,现在我想迭代这些行,并为每一行显示交易金额,以及当前行金额和前一行金额的差异

在DataBricks的帖子之后,我提出了这个查询,但它向我抛出了一个异常,我不能完全理解为什么

这是Pypark。。tx是已在注册为临时表时创建的数据帧

test =sqlContext.sql("SELECT tx.cc_num,tx.trans_date,tx.trans_time,tx.amt, (lag(tx.amt) OVER (PARTITION BY tx.cc_num ORDER BY  tx.trans_date,tx.trans_time ROW BETWEEN PRECEDING AND CURRENT ROW)) as prev_amt from tx")
和异常(被截断)

我真的很欣赏任何见解,这个功能是相当新的,并没有太多可以继续现有的例子或其他相关的职位

编辑

我还尝试在不使用SQL语句的情况下执行此操作,如下所示,但继续得到一个错误。我已经在Hive和SQLContext中使用了它,并且收到了相同的错误

windowSpec = \
Window \
    .partitionBy(h_tx_df_ordered['cc_num']) \
    .orderBy(h_tx_df_ordered['cc_num'],h_tx_df_ordered['trans_date'],h_tx_df_ordered['trans_time'])

windowSpec.rowsBetween(-1, 0)

lag_amt = \
   (lag(h_tx_df_ordered['amt']).over(windowSpec) - h_tx_df_ordered['amt'])
    tx_df_ordered.select(
    h_tx_df_ordered['cc_num'],
    h_tx_df_ordered['trans_date'],
    h_tx_df_ordered['trans_time'],
    h_tx_df_ordered['amt'],
    lag_amt.alias("prev_amt")).show()

回溯(最近一次呼叫最后一次):
文件“rdd_raw_data.py”,第116行,在
滞后金额别名(“上一个金额”).show()
文件“/opt/spark/python/pyspark/sql/dataframe.py”,第721行,选择
jdf=self.\u jdf.select(self.\u jcols(*cols))
文件“/home/brandon/anaconda/lib/python2.7/site packages/py4j/java_gateway.py”,第813行,在调用中__
回答,self.gateway\u客户端,self.target\u id,self.name)
文件“/home/brandon/anaconda/lib/python2.7/site packages/py4j/protocol.py”,第308行,在get_return_值中
格式(目标id,“.”,名称),值)
py4j.protocol.Py4JJavaError:调用o152.select时出错。
:org.apache.spark.sql.AnalysisException:无法解析窗口函数“lag”。请注意,使用窗口函数当前需要HiveContext;
位于org.apache.spark.sql.catalyst.analysis.CheckAnalysis$class.failAnalysis(CheckAnalysis.scala:38)
  • 框架规范应以关键字
    而非
  • 框架规范要求下限值或

    ROWS BETWEEN 1 PRECEDING AND CURRENT ROW
    
    无界
    关键字

    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
    
  • LAG
    函数根本不接受帧,因此正确的带有LAG的SQL查询可以如下所示

    SELECT tx.cc_num,tx.trans_date,tx.trans_time,tx.amt, LAG(tx.amt) OVER (
         PARTITION BY tx.cc_num ORDER BY  tx.trans_date,tx.trans_time
    ) as prev_amt from tx
    
  • 编辑

    关于SQL DSL的使用:

  • 正如您在错误消息中看到的那样

    请注意,使用窗口函数当前需要HiveContex

    确保使用
    HiveContext
    而不是
    sqlContext
    初始化
    sqlContext

  • windowSpec.rowsBetween(-1,0)
    不执行任何操作,但是
    lag
    函数再次不支持帧规范


  • 谢谢你的回复!我已经用附加的非sql语法(新错误)更新了帖子,并尝试根据您的建议更新sql语法(相同错误)。也许您可以查看我的第二次尝试和SQL语法,并明确指出我做错了什么
    test=sqlContext.sql(“选择tx.cc\u num、tx.trans\u日期、tx.trans\u时间、tx.amt,(延迟()超过(按tx.cc\u num按tx.trans\u日期、tx.trans\u时间行在无界的前一行和当前行之间的顺序划分))
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
    
    SELECT tx.cc_num,tx.trans_date,tx.trans_time,tx.amt, LAG(tx.amt) OVER (
         PARTITION BY tx.cc_num ORDER BY  tx.trans_date,tx.trans_time
    ) as prev_amt from tx