Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
310 views
in Technique[技术] by (71.8m points)

python - How to access a collection of items stored deep inside an array in PySpark Dataframe?

I have a PySpark dataframe-

root
 |-- itemId: string (nullable = true)
 |-- contents: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- contentId: string (nullable = true)
 |    |    |-- position: integer (nullable = true)

How do I get all the contentId for every itemId? It want to have a new column (array type) containing all the contentId for every given itemId.

How do I achieve this?


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You can explode and then group by the itemId, and use collect_list to get the array of contentId:

import pyspark.sql.functions as F

df.show(truncate=False)
+------------------------------+------+
|contents                      |itemId|
+------------------------------+------+
|[[content1, 1], [content2, 2]]|item1 |
|[[content3, 3], [content4, 4]]|item2 |
+------------------------------+------+

result = df.select('itemId', F.explode('contents').alias('contents')) 
           .groupBy('itemId') 
           .agg(F.collect_list('contents.contentId').alias('contents'))

result.show()
+------+--------------------+
|itemId|            contents|
+------+--------------------+
| item2|[content3, content4]|
| item1|[content1, content2]|
+------+--------------------+

Alternatively, you can use transform if you have Spark 3.0 or above:

import pyspark.sql.functions as F

result = df.select('itemId', F.expr("transform(contents, x -> x.contentId)").alias('contents'))

result.show()
+------+--------------------+
|itemId|            contents|
+------+--------------------+
| item1|[content1, content2]|
| item2|[content3, content4]|
+------+--------------------+

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...