Apache spark 基于相同ID合并pyspark数据帧行
我想展平hbase数据集。个人在其他表格中有两种类型的数据:邮件和电话。在以rel_id=data_id加入他们之后,我得到了一个人的两条单独记录Apache spark 基于相同ID合并pyspark数据帧行,apache-spark,group-by,pyspark,apache-spark-sql,Apache Spark,Group By,Pyspark,Apache Spark Sql,我想展平hbase数据集。个人在其他表格中有两种类型的数据:邮件和电话。在以rel_id=data_id加入他们之后,我得到了一个人的两条单独记录 |individual_id|rel_id|data_id| mail|phone|role --------------------------------------------------------- | 1| 100| 100|a@gmail.com| null|secon
|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
------------------------------------------------
是否可以以某种方式合并同一个单独的_id的邮件和电话列,并为每个数据类型角色创建新列,以便获得如下数据:
|individual_id| mail|phone|mail_role |phone_role
------------------------------------------------------
| 1|a@gmail.com| 123| secondary|primary
| 2|b@gmail.com| 345| primary|secondary
-----------------------------------------------------
非常感谢您的帮助。您可以按
个人id进行分组,并将其用作聚合功能。您必须将first
的ignorenulls
参数设置为True
:
首先从pyspark.sql.functions导入
df.groupBy(“个人id”).agg(
第一个(“邮件”,ignorenulls=True)。别名(“邮件”),
第一个(“电话”,ignorenulls=True)。别名(“电话”)
).show()
#+-------------+-----------+-----+
#|个人身份证|邮件|电话|
#+-------------+-----------+-----+
#| 1|a@gmail.com| 123|
#| 2|b@gmail.com| 345|
#+-------------+-----------+-----+
对于更新后的问题,您可以使用:
从pyspark.sql.functions导入时,col
df.groupBy(“个人id”).agg(
第一个(“邮件”,ignorenulls=True)。别名(“邮件”),
第一个(“电话”,ignorenulls=True)。别名(“电话”),
首先(当(col(“mail”).isNotNull()时,col(“role”)),ignorenulls=True)。别名(“mail\u role”),
首先(当(col(“phone”).isNotNull()时,col(“role”)),ignorenulls=True)。别名(“phone\u role”),
).show()
#+-------------+-----------+-----+---------+----------+
#|个人身份|邮件|电话|邮件|角色|电话|角色|
#+-------------+-----------+-----+---------+----------+
#| 1|a@gmail.com|123 |第二|小学|
#| 2|b@gmail.com|345 |初级|次级|
#+-------------+-----------+-----+---------+----------+