gpt4 book ai didi

scala - 如何在Spark DataFrame,Scala中将行转换为列

转载 作者:行者123 更新时间:2023-12-02 09:15:02 25 4
gpt4 key购买 nike

有什么办法可以将数据框行转置为列。
我有以下结构作为输入:

val inputDF = Seq(("pid1","enc1", "bat"),
("pid1","enc2", ""),
("pid1","enc3", ""),
("pid3","enc1", "cat"),
("pid3","enc2", "")
).toDF("MemberID", "EncounterID", "entry" )

inputDF.show:

+--------+-----------+-----+
|MemberID|EncounterID|entry|
+--------+-----------+-----+
| pid1| enc1| bat|
| pid1| enc2| |
| pid1| enc3| |
| pid3| enc1| cat|
| pid3| enc2| |
+--------+-----------+-----+

expected result:

+--------+----------+----------+----------+-----+
|MemberID|Encounter1|Encounter2|Encounter3|entry|
+--------+----------+----------+----------+-----+
| pid1| enc1| enc2| enc3| bat|
| pid3| enc1| enc2| null| cat|
+--------+----------+----------+----------+-----+

请建议是否有任何优化的直接API可用于将行转置为列。
我的输入数据量非常大,因此收集等操作将无法执行,因为它将所有数据存储在驱动程序中。
我正在使用Spark 2.x

最佳答案

我不确定您需要的是您实际提出的要求。但是,以防万一,这里有个主意:

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的值放在相应的“Encounter”列中,则可以使用数据透视表:
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")是可选的,但是由于您知道该列的内容,因此可以加快计算速度。

关于scala - 如何在Spark DataFrame,Scala中将行转换为列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47991462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com