有谁知道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");
这是不是为我工作的星火1.3.1。我在1.4.0中添加了“窗口函数”(partition/order by/desc),并在1.4.0中进行了安装,然后我会给出这个镜头 –
请参阅上面的编辑,获取有关使窗口函数使用Hive Context 。我接受这个答案,但为了清楚起见,可以随意在Hive上下文和SQL上下文中添加附加注释。 –
@ashK http://stackoverflow.com/q/31786912/1560062 – zero323