【发布时间】:2022-08-16 12:57:20
【问题描述】:
假设这是我的 1 dataframe 和 userId、deviceID 和 Clean_date(登录日期)
df =
| userId | deviceID | Clean_date |
|---|---|---|
| ABC123 | 202030 | 28-Jul-22 |
| XYZ123 | 304050 | 27-Jul-22 |
| ABC123 | 405032 | 28-Jul-22 |
| PQR123 | 385625 | 22-Jun-22 |
| PQR123 | 465728 | 22-Jun-22 |
| XYZ123 | 935452 | 22-Mar-22 |
假设以下是我的dataframe 2 和userId、deviceID 和transferdate(设备转移到用户ID 的日期)
df2 =
| userId | deviceID | transferdate |
|---|---|---|
| ABC123 | 202030 | 20-May-22 |
| XYZ123 | 304050 | 03-May-22 |
| ABC123 | 405032 | 02-Feb-22 |
| PQR123 | 385625 | 21-Jun-22 |
| PQR123 | 465728 | 2-Jul-22 |
| XYZ123 | 935452 | 26-Apr-22 |
现在,我想确定 3 个场景并使用标识符创建新列
- P1 = 用户在同一天使用多台设备登录 df 1,如果两台设备之一不是属于同一用户。
- P2 = 用户在 df 1 的不同日期使用多个设备登录,如果两个设备之一不是属于同一用户。
- NA = 对于 df 1,用户在同一天/不同天使用多台设备登录,如果两台设备属于同一用户。
因此我的输出表应如下所示:
df3 =
userId deviceID Clean_date transferdate identifier ABC123 202030 28-Jul-22 20-May-22 NA XYZ123 304050 27-Jul-22 03-May-22 P2 ABC123 405032 28-Jul-22 02-Feb-22 NA PQR123 385625 22-Jun-22 21-Jun-22 P1 PQR123 465728 22-Jun-22 02-Jul-22 P1 XYZ123 935452 22-Mar-22 26-Apr-22 P2 我试过下面的代码:
from pyspark.sql import functions as f, Window w=Window.partitionBy(\"userId\") w2 = Window.partitionBy(\"userId\", \"Clean_date\") df3 = ( df .withColumn( \"Priority\", f.when(f.size(f.collect_set(\"deviceID\").over(w2)) > 1, \"P1\") .when(f.size(f.collect_set(\"deviceID\").over(w)) > 1, \"P2\") .otherwise(\"NA\") ) )但是,我无法将 df2 中的
transferdate合并到此代码中。任何帮助将不胜感激。
-
您需要先加入
df2,然后才能引用其列。所以,第一个操作应该是:df.join(df2, on=\'userId\').withColumn(... -
用户在两个表中是否总是具有相同的 device_id (如您的示例中)?
标签: apache-spark pyspark