使用 PySpark 从数组创建整洁的数据框
Posted
技术标签:
【中文标题】使用 PySpark 从数组创建整洁的数据框【英文标题】:Using PySpark to Create Tidy Dataframe from Arrays 【发布时间】:2020-08-01 18:55:52 【问题描述】:我有一个 Spark 数据框,它有两个数组,如下所示:
df = spark.createDataFrame(
[((["Person", "Company", "Person", "Person"],
["John", "Company1", "Jenny", "Jessica"]))],
["Type", "Value"])
df.show()
+--------------------+--------------------+
| Type| Value|
+--------------------+--------------------+
|[Person, Company,...|[John, Company1, ...|
+--------------------+--------------------+
我想把它改成如下所示的整洁版本:
df = spark.createDataFrame(
[
("Person", "John"),
("Company", "Company1"),
("Person", "Jenny"),
("Person", "Jessica"),
],
["Type", "Value"])
df.show()
+-------+--------+
| Type| Value|
+-------+--------+
| Person| John|
|Company|Company1|
| Person| Jenny|
| Person| Jessica|
+-------+--------+
感谢 PySpark 或 SparkSQL 解决方案。 TIA。
【问题讨论】:
【参考方案1】:来自 Spark-2.4.0
使用 arrays_zip
函数压缩两个数组(列表),然后执行 explode
。
对于 Spark < 2.4
,请使用 udf
创建 zip。
Example:
df = spark.createDataFrame(
[((["Person", "Company", "Person", "Person"],
["John", "Company1", "Jenny", "Jessica"]))],
["Type", "Value"])
from pyspark.sql.functions import *
df.withColumn("az",explode(arrays_zip(col("Type"),col("Value")))).select("az.*").show()
#+-------+--------+
#| Type| Value|
#+-------+--------+
#| Person| John|
#|Company|Company1|
#| Person| Jenny|
#| Person| Jessica|
#+-------+--------+
#using spark sql
df.createOrReplaceTempView("tmp")
sql("select col.* from (select explode(arrays_zip(Type,Value)) from tmp)q").show()
#+-------+--------+
#| Type| Value|
#+-------+--------+
#| Person| John|
#|Company|Company1|
#| Person| Jenny|
#| Person| Jessica|
#+-------+--------+
【讨论】:
以上是关于使用 PySpark 从数组创建整洁的数据框的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 pyspark 从文本日志文件的特定部分创建数据框