簡體   English   中英

重組 Pyspark 數據框:使用行元素創建新列

[英]Reorganize Pyspark dataframe: Create new column using row element

我正在嘗試將具有此結構的文檔映射到數據框。

   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_outer數組、展平結構並使用.col + alias重命名,數據框將如下所示:

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,我會執行以下操作:

from pyspark.sql import functions as F

passholder_df = df.select(
    "ID",
    "Type",
    F.col("Tag_value").alias("Tag_passHolder"),
    F.col("Tag_stat").alias("passHolder_stat"),
    "version",
).where("Tag_name = 'passHolder'")

passnum_df = df.select(
    "ID",
    "Type",
    F.col("Tag_value").alias("Tag_passNum"),
    F.col("Tag_stat").alias("passNum_stat"),
    "version",
).where("Tag_name = 'passNum'")

passholder_df.join(passnum_df, on=["ID", "Type", "version"], how="full")

根據您的業務規則,您可能需要在連接條件上做一些工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM