Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 重新组织Pyspark dataframe:使用行元素创建新列_Python_Pyspark_Apache Spark Sql - Fatal编程技术网

Python 重新组织Pyspark dataframe:使用行元素创建新列

Python 重新组织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" |

我正在尝试将具有此结构的文档映射到dataframe

   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