我想扁平化 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
作为聚合函数。您必须将first
的ignorenulls
参数设置为 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|
#+-------------+-----------+-----+---------+----------+