0

AWS Glue ジョブの一部として PySpark を使用して 2 つのデータフレームを操作しようとしています。

df1:

item    tag
1       AB 
2       CD
3       EF
4       QQ

df2:

key1    key2    tags
A1      B1      [AB]
A1      B2      [AB, CD, EF]
A2      B1      [CD, EF]
A2      B3      [AB, EF, ZZ]

次の方法で、df2 の配列を df1 のタグと一致させたいと思います。

item  key1   key2   tag
1     A1     B1     AB
1     A1     B2     AB
2     A1     B2     CD
2     A2     B1     CD
3     A1     B2     EF
3     A2     B1     EF
3     A2     B3     EF

したがって、df1 のタグは、df2 のタグ エントリに基づいて行を展開するために使用されます。たとえば、アイテム 1 のタグ「AB」は、最初の 2 行の df2 のタグ配列に含まれています。

また、タグ QQ が df2 のどの配列にも存在しないため、4 がどのように無視されるかに注意してください。

これが内部結合になることはわかっていますが、df1.tag と df2.tags を一致させて key1 と key2 を取り込む方法がわかりません。どんな援助でも大歓迎です。

4

2 に答える 2

2

array_contains条件を使用して結合できます。

import pyspark.sql.functions as F

result = (df1.join(df2, F.array_contains(df2.tags, df1.tag))
             .select('item', 'key1', 'key2', 'tag')
             .orderBy('item', 'key1', 'key2')
         )

result.show()
+----+----+----+---+
|item|key1|key2|tag|
+----+----+----+---+
|   1|  A1|  B1| AB|
|   1|  A1|  B2| AB|
|   1|  A2|  B3| AB|
|   2|  A1|  B2| CD|
|   2|  A2|  B1| CD|
|   3|  A1|  B2| EF|
|   3|  A2|  B1| EF|
|   3|  A2|  B3| EF|
+----+----+----+---+
于 2021-03-19T08:12:36.257 に答える