在pyspark中执行类似excel的“vlookup”方法

sy5wg1nm  于 2021-05-17  发布在  Spark
关注(0)|答案(2)|浏览(532)

我是pyspark的新手,我想得到一些帮助。我有一个Pypark数据框 df1 如下图所示:

df1 =
|---------------------|------------------|------------------|
|     ID_Machine      |  Event_Duration  |     Timestamp    |
|---------------------|------------------|------------------|
|          1          |         34       |        213       |
|---------------------|------------------|------------------|
|          1          |         97       |        572       |
|---------------------|------------------|------------------|
|          1          |         78       |        872       |
|---------------------|------------------|------------------|
|          2          |         83       |        345       |
|---------------------|------------------|------------------|
|          2          |         14       |        718       |
|---------------------|------------------|------------------|
|          2          |         115      |        884       |
|---------------------|------------------|------------------|

从中,我必须执行 groupBy 使用聚合方法:

df2 = df1.groupBy("ID_Machine").agg(F.max("Event_duration").alias("Max_Event_Duration")

从而获得:

df2 = 
|---------------------|---------------------------|
|      ID_Machine     |     Max_Event_Duration    |
|---------------------|---------------------------|
|           1         |             97            |
|---------------------|---------------------------|
|           2         |             115           |
|---------------------|---------------------------|

到目前为止,还不错。不过,现在我想做一些类似 vlookup 在excel中,检索 Timestamp 价值 df1 对应于 Max_Event_Durationdf2 ,获得如下结果:

|---------------------|---------------------|------------------|
|     ID_Machine      |  Max_Event_Duration |     Timestamp    |
|---------------------|---------------------|------------------|
|          1          |          97         |        572       |
|---------------------|---------------------|------------------|
|          2          |          115        |        884       |
|---------------------|---------------------|------------------|

有人知道如何创建第三个Dataframe,或者如何修改创建第三个Dataframe的代码吗 df2 为了包括各自的 Timestamp 价值?
谢谢!

lp0sw83n

lp0sw83n1#

您必须首先创建一个名为max event的dataframe,其名称与og dataframe中的相同

df_max = df1.groupBy("ID_Machine").agg(F.max("Event_Duration").alias("Event_Duration"))
df_max.show()

这样你就可以

+----------+--------------+
|ID_Machine|Event_Duration|
+----------+--------------+
|         1|            97|
|         2|           115|
+----------+--------------+

然后通过两个相似的命名列连接Dataframe,然后重命名事件持续时间

df_combined = df_max.join(df1, ["ID_Machine", "Event_Duration"]) \
                .withColumnRenamed("Event_Duration", "Max_Event_Duration")
df_combined.show()

这会给你

+----------+------------------+---------+
|ID_Machine|Max_Event_Duration|Timestamp|
+----------+------------------+---------+
|         2|               115|      884|
|         1|                97|      572|
+----------+------------------+---------+
mec1mxoz

mec1mxoz2#

你可以把它做成一个新的列 max_event_duration 并过滤其中的列 event_duration = max_event_duration ```
df2 = df1.select('*', F.max("Event_duration").over(Window.partitionBy("ID_Machine")).alias("Max_Event_Duration"))
.filter("Event_duration = Max_Event_Duration")
.drop("Max_Event_Duration")

相关问题