arrays - 使用 PySpark 从数组创建整洁的数据框
问题描述
我有一个 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。
解决方案
从Spark-2.4.0
使用arrays_zip
函数压缩两个数组(列表),然后执行explode
.
用于创建 zip Spark < 2.4
。udf
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|
#+-------+--------+
推荐阅读
- python - 如何使用 argparse 将二进制文件作为标准输入传递给 Docker 容器化 Python 脚本?
- vb.net - 将字符串格式转换为日期格式
- typescript - Ionic 4 通过一键事件播放带有嚎叫的单个音频
- video - ffmpeg 和 libx264 视频无法在视频播放器上播放
- node.js - 在一个应用程序中部署两台 Express 服务器
- node.js - 猫鼬中间件获取将被添加的文档
- c# - Windows 服务正常启动但未执行代码
- machine-learning - 决策树拆分策略
- javascript - Python 和 JavaScript 基本通信
- laravel - 十月CMS | 同一控制器中的动态 importExportConfig