SPARK SQL等效的Qualify + Row_number语句

有谁知道Apache Spark SQL获得与标准SQL qualify()+ rnk或row_number语句相同的结果的最佳方式吗?SPARK SQL等效的Qualify + Row_number语句

例如:

  • 我有称为statement_data与每个为100个独特的account_numbers 12个月记录的火花数据帧,因此1200在总
  • 记录每个每月记录有一个被称为“statement_date”,可以字段被用于确定最近的记录

我希望我的最终结果是一个新的Spark Dataframe,其最近3条记录(由statement_date降序确定)为100个唯一account_number因此总共有300个最终记录。

在标准的Teradata SQL,我可以做到以下几点:

select * from statement_data 

qualify row_number()

over(partition by acct_id order by statement_date desc) <= 3

阿帕奇星火SQL不具有独立资格的功能,我所知道的,也许我搞砸了语法或可”找到符合条件的文档。

这是好的,如果我需要,只要这两个步骤是这样做的两个步骤:

  • 选择查询或替代方法来分配等级/行编号为每个ACCOUNT_NUMBER的记录
  • 一选择查询,我选择排名为< = 3的所有记录(即选择第一,第二和第三个最新记录)。

编辑1 - 7/23 14:09: 由zero323提供的初步解决方案不是在星火1.4.1安装SQL星火1.4.1依赖为我工作。

EDIT 2 - 7/23 3:24 pm: 事实证明,这个错误与我的查询使用SQL Context对象而不是Hive Context有关。我现在能够正确运行下面的解决方案中加入以下代码后创建和使用蜂巢语境:

final JavaSparkContext sc2; 

final HiveContext hc2;

DataFrame df;

hc2 = TestHive$.MODULE$;

sc2 = new JavaSparkContext(hc2.sparkContext());

....

// Initial Spark/SQL contexts to set up Dataframes

SparkConf conf = new SparkConf().setAppName("Statement Test");

...

DataFrame stmtSummary =

hc2.sql("SELECT * FROM (SELECT acct_id, stmt_end_dt, stmt_curr_bal, row_number() over (partition by acct_id order by stmt_curr_bal DESC) rank_num FROM stmt_data) tmp WHERE rank_num <= 3");

回答:

没有qualify(它通常是有用的检查parser source),但你可以使用子查询这样的:

SELECT * FROM (

SELECT *, row_number() OVER (

PARTITION BY acct_id ORDER BY statement_date DESC

) rank FROM df

) tmp WHERE rank <= 3

又见SPARK : failure: ``union'' expected but `(' found

以上是 SPARK SQL等效的Qualify + Row_number语句 的全部内容, 来源链接: utcz.com/qa/263288.html

回到顶部