将列的内容拆分为pyspark中的行
Posted
技术标签:
【中文标题】将列的内容拆分为pyspark中的行【英文标题】:split content of column into lines in pyspark 【发布时间】:2017-11-28 13:33:01 【问题描述】:我有一个数据框 df:
+------+----------+--------------------+
|SiteID| LastRecID| Col_to_split|
+------+----------+--------------------+
| 2|1056962584|[214, 207, 206, 205]|
| 2|1056967423| [213, 208]|
| 2|1056870114| [213, 202, 199]|
| 2|1056876861|[203, 213, 212, 1...|
我想将列拆分成这样的行:
+----------+-------------+-------------+
| RecID| index| Value|
+----------+-------------+-------------+
|1056962584| 0| 214|
|1056962584| 1| 207|
|1056962584| 2| 206|
|1056962584| 3| 205|
|1056967423| 0| 213|
|1056967423| 1| 208|
|1056870114| 0| 213|
|1056870114| 1| 202|
|1056870114| 2| 199|
|1056876861| 0| 203|
|1056876861| 1| 213|
|1056876861| 2| 212|
|1056876861| 3| 1..|
|1056876861| etc...| etc...|
Value 包含列表中的值。 Index 包含列表中值的索引。
如何使用 PySpark 做到这一点?
【问题讨论】:
【参考方案1】:从 Spark 2.1.0 开始,您可以使用 posexplode
哪个 unnest 数组列并输出每个元素的索引,(使用来自 @Herve 的数据):
import pyspark.sql.functions as F
df.select(
F.col("LastRecID").alias("RecID"),
F.posexplode(F.col("coltosplit")).alias("index", "value")
).show()
+-----+-----+-----+
|RecID|index|value|
+-----+-----+-----+
|10526| 0| 214|
|10526| 1| 207|
|10526| 2| 206|
|10526| 3| 205|
|10896| 0| 213|
|10896| 1| 208|
+-----+-----+-----+
【讨论】:
【参考方案2】:我很快尝试使用 Spark 2.0 如果您想以不同的方式订购,可以稍微更改查询。
d = ['SiteID': '2', 'LastRecId': 10526, 'coltosplit': [214,207,206,205], 'SiteID': '2', 'LastRecId': 10896, 'coltosplit': [213,208]]
df = spark.createDataFrame(d)
+---------+------+--------------------+
|LastRecId|SiteID| coltosplit|
+---------+------+--------------------+
| 10526| 2|[214, 207, 206, 205]|
| 10896| 2| [213, 208]|
+---------+------+--------------------+
query = """
select LastRecId as RecID,
(row_number() over (partition by LastRecId order by 1)) - 1 as index,
t as Value
from test
LATERAL VIEW explode(coltosplit) test AS t
"""
df.createTempView("test")
spark.sql(query).show()
+-----+-----+-----+
|RecID|index|Value|
+-----+-----+-----+
|10896| 0| 213|
|10896| 1| 208|
|10526| 0| 214|
|10526| 1| 207|
|10526| 2| 206|
|10526| 3| 205|
+-----+-----+-----+
所以基本上我只是将列表分解为一个新列。并在此列上应用行号。
希望对你有帮助
【讨论】:
以上是关于将列的内容拆分为pyspark中的行的主要内容,如果未能解决你的问题,请参考以下文章