在pyspark中匹配数组

k0pti3hp  于 2021-07-14  发布在  Spark
关注(0)|答案(2)|浏览(447)

我正在尝试使用pyspark作为aws粘合作业的一部分来操作两个Dataframe。
df1型:

  1. item tag
  2. 1 AB
  3. 2 CD
  4. 3 EF
  5. 4 QQ

df2型:

  1. key1 key2 tags
  2. A1 B1 [AB]
  3. A1 B2 [AB, CD, EF]
  4. A2 B1 [CD, EF]
  5. A2 B3 [AB, EF, ZZ]

我想通过以下方式将df2中的数组与df1中的标记匹配起来:

  1. item key1 key2 tag
  2. 1 A1 B1 AB
  3. 1 A1 B2 AB
  4. 2 A1 B2 CD
  5. 2 A2 B1 CD
  6. 3 A1 B2 EF
  7. 3 A2 B1 EF
  8. 3 A2 B3 EF

因此,df1中的标记用于根据df2中的标记条目展开行。例如,项1的标记“ab”出现在前两行的df2中的tags数组中。
还要注意4是如何被忽略的,因为标记qq在df2的任何数组中都不存在。
我知道这将是一个内部连接,但我不知道如何匹配df1.tag和df2.tags来拉入key1和key2。任何协助都将不胜感激。

nafvub8i

nafvub8i1#

可以使用 array_contains 条件:

  1. import pyspark.sql.functions as F
  2. result = (df1.join(df2, F.array_contains(df2.tags, df1.tag))
  3. .select('item', 'key1', 'key2', 'tag')
  4. .orderBy('item', 'key1', 'key2')
  5. )
  6. result.show()
  7. +----+----+----+---+
  8. |item|key1|key2|tag|
  9. +----+----+----+---+
  10. | 1| A1| B1| AB|
  11. | 1| A1| B2| AB|
  12. | 1| A2| B3| AB|
  13. | 2| A1| B2| CD|
  14. | 2| A2| B1| CD|
  15. | 3| A1| B2| EF|
  16. | 3| A2| B1| EF|
  17. | 3| A2| B3| EF|
  18. +----+----+----+---+
展开查看全部
rbpvctlc

rbpvctlc2#

  1. import pyspark.sql.functions as F
  2. df = df1.join(
  3. df2.select('key1', 'key2', F.explode('tags').alias('tag')),
  4. 'tag',
  5. 'inner'
  6. )
  7. df.show()
  8. # +---+----+----+----+
  9. # |tag|item|key1|key2|
  10. # +---+----+----+----+
  11. # | EF| 3| A1| B2|
  12. # | EF| 3| A2| B1|
  13. # | EF| 3| A2| B3|
  14. # | AB| 1| A1| B1|
  15. # | AB| 1| A1| B2|
  16. # | AB| 1| A2| B3|
  17. # | CD| 2| A1| B2|
  18. # | CD| 2| A2| B1|
  19. # +---+----+----+----+
展开查看全部

相关问题