Python 重新组织Pyspark dataframe:使用行元素创建新列
我正在尝试将具有此结构的文档映射到dataframePython 重新组织Pyspark dataframe:使用行元素创建新列,python,pyspark,apache-spark-sql,Python,Pyspark,Apache Spark Sql,我正在尝试将具有此结构的文档映射到dataframe root |-- Id: "a1" |-- Type: "Work" |-- Tag: Array | |--0: Object | | |-- Tag.name : "passHolder" | | |-- Tag.value : "Jack Ryan" |
root
|-- Id: "a1"
|-- Type: "Work"
|-- Tag: Array
| |--0: Object
| | |-- Tag.name : "passHolder"
| | |-- Tag.value : "Jack Ryan"
| | |-- Tag.stat : "verified"
| |-- 1: Object
| | |-- Tag.name : "passNum"
| | |-- Tag.value : "1234"
| | |-- Tag.stat : "unverified"
|-- version: 1.5
通过使用explode\u outer
分解数组,展平结构并使用.col
+别名
重命名,数据帧将如下所示:
df = df.withColumn("Tag",F.explode_outer("Tag"))
df = df.select(col("*"),
.col("Tag.name").alias("Tag_name"),
.col("Tag.value").alias("Tag_value"),
.col("Tag.stat").alias("Tag_stat")).drop("Tag")
+--+----+-----------+-----------+---------+---------+
|Id|Type| Tag_name | Tag_value |Tag_stat | version |
+--+----+-----------+-----------+---------+---------+
a1 Work passHolder Jack Ryan verified 1.5
a1 Work passNum 1234 unverified 1.5
我试图重新组织df结构,使其更易于查询,方法是将某些行元素作为列名,并用相关值填充它。
是否有人能帮助给出达到如下所示输出格式所需的指针/步骤?非常感谢你的建议
目标格式:
+--+----+-----------------+-----------------+-------------+------------+--------+
|Id|Type| Tag_passHolder | passHolder_stat | Tag_passNum |passNum_stat||version|
+--+----+-----------------+-----------------+-------------+------------+--------+
a1 Work Jack Ryan verified 1234 unverified 1.5
根据您显示的输出df,我将执行以下操作:
从pyspark.sql导入函数为F
通行证持有人_df=df.select(
“身份证”,
“类型”,
F.col(“标签价值”)。别名(“标签持有人”),
F.col(“标记统计”).别名(“密码持有人统计”),
“版本”,
).where(“Tag_name=‘passHolder’”)
passnum_df=df.select(
“身份证”,
“类型”,
F.col(“标记值”)。别名(“标记值”),
F.col(“标记统计”).别名(“密码统计”),
“版本”,
).where(“Tag_name='passNum'))
passholder_df.join(passnum_df,on=[“ID”,“Type”,“version”],how=“full”)
根据您的业务规则,您可能需要对连接条件做一些工作。听起来像是一个简单的连接。你试过了吗?@史蒂文,我没有。您能否帮助我们进一步了解如何使用连接实现目标sparkdf?我在这里得到了您的方法@Steven,谢谢。如果
Tag
数组是动态的,并且可以有多个具有相同结构的对象,是否可以(递归地)将Tag.name
value检索为新列,并为每个对象填充Tag.value
?