我不确定你需要的是你真正要求的。然而,为了以防万一,这里有一个想法:
val entries = inputDF.where('entry isNotNull)
.where('entry !== "")
.select("MemberID", "entry").distinct
val df = inputDF.groupBy("MemberID")
.agg(collect_list("EncounterID") as "encounterList")
.join(entries, Seq("MemberID"))
df.show
+--------+-------------------------+-----+
|MemberID| encounterList |entry|
+--------+-------------------------+-----+
| pid1| [enc2, enc1, enc3]| bat|
| pid3| [enc2, enc1]| cat|
+--------+-------------------------+-----+
列表的顺序不是确定的,但您可以对其进行排序,然后使用
.withColumn("Encounter1", sort_array($"encounterList")(0))
...
其他想法
如果要将entry的值放入相应的“Conference”列中,可以使用透视:
inputDF
.groupBy("MemberID")
.pivot("EncounterID", Seq("enc1", "enc2", "enc3"))
.agg(first("entry")).show
+--------+----+----+----+
|MemberID|enc1|enc2|enc3|
+--------+----+----+----+
| pid1| bat| | |
| pid3| cat| | |
+--------+----+----+----+
正在添加
Seq("enc1", "enc2", "enc3")
是可选的,但由于您知道列的内容,因此会加快计算速度。