2017-09-04 81 views
0

我在解决以下问题时遇到问题。 基本上我想找到哪个日期的特定项目(item_code)被出售的最大和最小量。在火花数据帧中汇总多个列

输入数据帧

item_code, sold_date, price, volume 
101,  10-12-2017, 20, 500 
101,  11-12-2017, 20, 400 
201,  10-12-2017, 50, 200 
201,  13-12-2017, 51, 300 

预计输出

查找maxmin体积出售date.I希望这个解决方案,而无需使用任何lambda操作。

enter image description here

df.groupBy("item_code")agg(min("volume"),max("volume")) 

上面的人会帮助我获得max和体积min,但我希望他们有各自的日期。

我用udf试过了我最好的级别,但是我无法破解它。任何帮助高度赞赏。

+0

请尝试发布文本样品而不是图像。谢谢。 – philantrovert

+0

Thanks.Updated my post @philantrovert – BDR

+0

它din帮助我。我想要在哪个sold_date,给定item_code的最大/最小音量。 first()将相同的日期返回给我的所有结果。 – BDR

回答

1

您想要的最终输出需要复杂的过程。您可以使用以下过程。

鉴于输入dataframe作为

+---------+----------+-----+------+ 
|item_code|sold_date |price|volume| 
+---------+----------+-----+------+ 
|101  |10-12-2017|20 |500 | 
|101  |11-12-2017|20 |400 | 
|201  |10-12-2017|50 |200 | 
|201  |13-12-2017|51 |300 | 
+---------+----------+-----+------+ 

您可以使用下面的代码

import org.apache.spark.sql.functions._ 
val tempDF = df.groupBy("item_code").agg(min("volume").as("min"),max("volume").as("max")) 
tempDF.as("t2").join(df.as("t1"), col("t1.item_code") === col("t2.item_code") && col("t1.volume") === col("t2.min"), "left") 
    .select($"t2.item_code", $"t2.max", concat_ws(",", $"t2.item_code", $"t2.min", $"t1.sold_date").as("min")) 
    .join(df.as("t3"), col("t3.item_code") === col("t2.item_code") && col("t3.volume") === col("t2.max"), "left") 
    .select($"min", concat_ws(",", $"t3.item_code", $"t2.max", $"t3.sold_date").as("max")) 
    .show(false) 

这将会给你dataframe你的愿望

+------------------+------------------+ 
|min    |max    | 
+------------------+------------------+ 
|101,400,11-12-2017|101,500,10-12-2017| 
|201,200,10-12-2017|201,300,13-12-2017| 
+------------------+------------------+ 
+0

似乎是相当昂贵的过程.....需要很多的时间甚至对200MB的数据集。 – BDR

+1

连接总是很贵:) –