Pyspark - 基于列表中的值爆炸数据框

Posted

技术标签:

【中文标题】Pyspark - 基于列表中的值爆炸数据框【英文标题】:Pyspark - exploding dataframe based on values within a list 【发布时间】:2020-05-26 17:21:18 【问题描述】:

这是我的数据框:

+--------------------+--------------------+
|             core_id|    movie_genres_upd|
+--------------------+--------------------+
|12f99f04-5168-438...|[Comedy, Mockumen...|
|32c7d12f-6bf2-4e5...|[Action, Blockbus...|
|9f067041-3b49-4db...|[Animation, Comed...|
|c6d203cb-afcf-4e8...|[Action, Adventur...|
|b02416f9-5761-48f...|[Adventure, Anima...|

这些是我的数据类型:

[('core_id', 'string'), ('movie_genres_upd', 'array<string>')]

我将提供一个更直观的示例。这是初始数据框:

id  genres
1   ["comedy", "blockbuster"]
2   ["drama", "animation", "comedy"] 

所需的数据框:

id genres
1  "comedy"
1  "blockbuster"
2  "drama"
2  "animation"
2  "comedy"

我是 pyspark 的新手,所以我正在为此苦苦挣扎。任何帮助将非常感激。

【问题讨论】:

这能回答你的问题吗? Explode in PySpark 【参考方案1】:

如果这有帮助,请告诉我:

>>> from pyspark.sql.functions import explode
>>> from pyspark.sql.types import (
...     StringType,
...     StructField,
...     StructType,
...     ArrayType
... )
>>>
>>> schema = StructType([
...     StructField('core_id', StringType(), True),
...     StructField('movie_genres_upd', ArrayType(StringType()), True)
... ])
>>>
>>> list = [[1, ["comedy", "blockbuster"]], [2, ["drama", "animation", "comedy"]]]
>>> df = spark.createDataFrame(list, schema)
>>> df2 = df.select('core_id', explode("movie_genres_upd").alias('genre'))
>>> df2.show()
+-------+-----------+
|core_id|      genre|
+-------+-----------+
|      1|     comedy|
|      1|blockbuster|
|      2|      drama|
|      2|  animation|
|      2|     comedy|
+-------+-----------+

【讨论】:

以上是关于Pyspark - 基于列表中的值爆炸数据框的主要内容,如果未能解决你的问题,请参考以下文章

基于另一列中的值的一列上的pyspark滞后函数

分组并爆炸pyspark数组类型列

如何根据 PySpark 数据框的另一列中的值修改列? F.当边缘情况

PySpark 2.2 爆炸删除空行(如何实现explode_outer)? [复制]

用列表 Pyspark Dataframe 中的值替换 NA

PYSPARK:-在数据框中爆炸数组而不丢失空值:'DataFrame'对象没有属性'_get_object_id'