在pyspark中加入两个列,其中一列可以有重复项

zpf6vheq  于 2023-11-16  发布在  Spark
关注(0)|答案(1)|浏览(184)

我有一个pyspark框架,有2列,IDcondition。ID对应一个用户,用户可以有多个条件。我想找出那些有条件A和条件B的用户,怎么做?
示例框架:
| ID|条件|
| --|--|
| 1 |一|
| 2 |B|
| 1 |B|
| 1 |C|
| 2 |C|
| 2 |D|
| 1 |E|
如果我想得到以A、B为条件的用户,我只需要1作为输出;如果我想得到以C、D为条件的用户,我只需要2作为输出;如果我想得到以B、C为条件的用户,我需要1和2作为输出。
这些要求以下列方框表示:
| sl_no|条件|
| --|--|
| S1| [A、B]|
| S2| [C、D]|
| S3| [B,C]|
我的尝试如下:

  1. df1=df.groupBy('USER_ID').agg(F.collect_set('CONDITION').alias('conditions'))
  2. df2=conditions_data
  3. result=df1.join(df2,F.array_intersection(df1['conditions'],df2['conditions'])==df2['conditions'])

字符串
然而,我看到一些不一致的结果。同时,想知道是否有一个更好的方法来做到这一点。

s71maibg

s71maibg1#

收集每个ID的唯一条件

  1. users = df1.groupby('ID').agg(F.collect_set('CONDITION').alias('CONDITION'))
  2. # +---+------------+
  3. # | ID| CONDITION|
  4. # +---+------------+
  5. # | 1|[C, E, B, A]|
  6. # | 2| [C, B, D]|
  7. # +---+------------+

字符串
将conditions_data与users对象框架联接,其中联接条件必须满足集合成员资格测试

  1. cond = F.expr("size(array_intersect(conditions, CONDITION)) = size(conditions)")
  2. result = conditions_data.join(users, on=cond, how='left')
  3. # +-----+----------+---+------------+
  4. # |sl_no|conditions| ID| CONDITION|
  5. # +-----+----------+---+------------+
  6. # | s1| [A, B]| 1|[C, E, B, A]|
  7. # | s2| [C, D]| 2| [C, B, D]|
  8. # | s3| [B, C]| 1|[C, E, B, A]|
  9. # | s3| [B, C]| 2| [C, B, D]|
  10. # +-----+----------+---+------------+


收集condition_data中每个唯一行的用户

  1. result = result.groupby(*conditions_data.columns).agg(F.collect_list('ID').alias('ID'))
  2. # +-----+----------+------+
  3. # |sl_no|conditions| ID|
  4. # +-----+----------+------+
  5. # | s1| [A, B]| [1]|
  6. # | s2| [C, D]| [2]|
  7. # | s3| [B, C]|[1, 2]|
  8. # +-----+----------+------+

展开查看全部

相关问题