按 Spark SQL 中的多列分区无法正常工作
partition by multiple columns in Spark SQL not working properly
我想在查询中按三列进行分区:
- 用户编号
- 取消月年。
- 保留月份年份。
我按如下方式使用行号和分区
row_number() over (partition by user_id ,cast ( date_format(cancelation_date,'yyyyMM') as integer),cast ( date_format(retention_date,'yyyyMM') as integer) order by cast ( date_format(cancelation_date,'yyyyMM') as integer) asc, cast ( date_format(retention_date,'yyyyMM') as integer) asc) as row_count
我得到的输出示例:
| user_id |cancelation_date |cancelation_month_year|retention_date|retention_month_year|row_count|
| -------- | -------------- |----------------------|--------------|--------------------|---------|
| 566 | 28-5-2020 | 202005 | 20-7-2020 | 202007 |1 |
| 566 | 28-5-2020 | 202005 | 30-7-2-2020 | 202007 |2 |
我想要得到的输出示例:
user_id
cancelation_date
cancelation_month_year
retention_date
retention_month_year
row_count
566
28-5-2020
202005
20-7-2020
202007
1
566
28-5-2020
202005
30-7-2-2020
202007
1
请注意,用户可能有多个取消月份,例如,如果他在 8 月份取消,我希望 8 月份所有日期的行计数 =2,依此类推。
不清楚为什么分区依据是按保留日期分区而不是按保留月份年份分区。
我的印象是 row_number
不是您想要的,而是您对 dense_rank
感兴趣,您将在其中获得预期的输出。
我想在查询中按三列进行分区:
- 用户编号
- 取消月年。
- 保留月份年份。
我按如下方式使用行号和分区
row_number() over (partition by user_id ,cast ( date_format(cancelation_date,'yyyyMM') as integer),cast ( date_format(retention_date,'yyyyMM') as integer) order by cast ( date_format(cancelation_date,'yyyyMM') as integer) asc, cast ( date_format(retention_date,'yyyyMM') as integer) asc) as row_count
我得到的输出示例:
| user_id |cancelation_date |cancelation_month_year|retention_date|retention_month_year|row_count|
| -------- | -------------- |----------------------|--------------|--------------------|---------|
| 566 | 28-5-2020 | 202005 | 20-7-2020 | 202007 |1 |
| 566 | 28-5-2020 | 202005 | 30-7-2-2020 | 202007 |2 |
我想要得到的输出示例:
user_id | cancelation_date | cancelation_month_year | retention_date | retention_month_year | row_count |
---|---|---|---|---|---|
566 | 28-5-2020 | 202005 | 20-7-2020 | 202007 | 1 |
566 | 28-5-2020 | 202005 | 30-7-2-2020 | 202007 | 1 |
请注意,用户可能有多个取消月份,例如,如果他在 8 月份取消,我希望 8 月份所有日期的行计数 =2,依此类推。
不清楚为什么分区依据是按保留日期分区而不是按保留月份年份分区。
我的印象是 row_number
不是您想要的,而是您对 dense_rank
感兴趣,您将在其中获得预期的输出。