基于同一 ID 合并 pyspark 数据帧行



我想扁平化 hbase 数据集。个人在其他表,邮件和电话中有2种类型的数据。在 rel_id=data_id 加入他们后,我得到了一个人的 2 条单独的记录。

    |individual_id|rel_id|data_id|       mail|phone|role
    ---------------------------------------------------------
    |            1|   100|    100|a@gmail.com| null|secondary
    |            1|   200|    200|       null|  123|primary
    |            2|   300|    300|       null|  345|secondary
    |            2|   400|    400|b@gmail.com| null|primary
    ------------------------------------------------

是否可以以某种方式合并同一individual_id的邮件和电话列,并为每个数据类型角色创建新列,所以我会有这样的数据:

    |individual_id|       mail|phone|mail_role |phone_role
    ------------------------------------------------------
    |            1|a@gmail.com|  123| secondary|primary
    |            2|b@gmail.com|  345|   primary|secondary
    -----------------------------------------------------

我真的很感激任何帮助。

您可以

individual_id分组并使用pyspark.sql.functions.first作为聚合函数。您必须将firstignorenulls参数设置为 True

from pyspark.sql.functions import first
df.groupBy("individual_id").agg(
    first("mail", ignorenulls=True).alias("mail"), 
    first("phone", ignorenulls=True).alias("phone")
).show()
#+-------------+-----------+-----+
#|individual_id|       mail|phone|
#+-------------+-----------+-----+
#|            1|a@gmail.com|  123|
#|            2|b@gmail.com|  345|
#+-------------+-----------+-----+

对于更新的问题,您可以使用pyspark.sql.functions.when

from pyspark.sql.functions import when, col
df.groupBy("individual_id").agg(
    first("mail", ignorenulls=True).alias("mail"), 
    first("phone", ignorenulls=True).alias("phone"),
    first(when(col("mail").isNotNull(), col("role")), ignorenulls=True).alias("mail_role"),
    first(when(col("phone").isNotNull(), col("role")), ignorenulls=True).alias("phone_role"),
).show()
#+-------------+-----------+-----+---------+----------+
#|individual_id|       mail|phone|mail_role|phone_role|
#+-------------+-----------+-----+---------+----------+
#|            1|a@gmail.com|  123| seconary|   primary|
#|            2|b@gmail.com|  345|  primary| secondary|
#+-------------+-----------+-----+---------+----------+

相关内容

  • 没有找到相关文章

最新更新