簡體   English   中英

Pyspark Dataframe 通過消除 null 值合並行

[英]Pyspark Dataframe Merge Rows by eliminating null values

我有一個像這樣的 Pyspark 數據框

+-----------+-------+----------+-------+-------+---------+
| ID_PRODUCT| VALUE | TIMESTAMP| SPEED |  CODE | FIRMWARE|
+-----------+-------+----------+-------+-------+---------+
|          3|      1|      null| 124,21|   null|     null|
|          5|      2|      null| 124,23|   null|     null|
|          5|      2|      null| 124,26|   null|     null|
|          6|      4|      null| 124,24|   null|     null|
|          3|      1|      null|   null|   6764|     null|
|          5|      2|      null|   null|   6772|     null|
|          5|      2|      null|   null|   6782|     null|
|          6|      4|      null|   null|   6932|     null|
|          3|      1|      null|   null|   null|        1|
|          5|      2|      null|   null|   null|        1|
|          5|      2|      null|   null|   null|        1|
|          6|      4|      null|   null|   null|        1|
|          3|      1|  17:18:04|   null|   null|     null|
|          5|      2|  18:22:40|   null|   null|     null|
|          5|      2|  18:25:29|   null|   null|     null|
|          6|      4|  18:32:18|   null|   null|     null|
+-----------+-------+----------+-------+-------+---------+

我想合並它的列,它應該看起來像(例如):

+-----------+-------+----------+-------+-------+---------+
| ID_PRODUCT| VALUE | TIMESTAMP| SPEED |  CODE | FIRMWARE|
+-----------+-------+----------+-------+-------+---------+
|          3|      1|  17:18:04| 124,21|   6764|        1|
|          5|      2|  18:22:40| 124,23|   6772|        1|
|          5|      2|  18:25:29| 124,26|   6782|        1|
|          6|      4|  18:32:18| 124,24|   6932|        1|
+-----------+-------+----------+-------+-------+---------+

我嘗試使用:

df = df.groupBy('id').agg(*[f.first(x,ignorenulls=True) for x in df.columns])

然而,這只是給我列的第一個值,我需要所有記錄。 因為對於一個 ID,我有不同的注冊時間戳和不同的注冊值,我現在正在丟失。

謝謝你的建議

我不確定這是否是你想要的,但基本上你可以為每個 id 和列做一個 collect_list ,並展開所有結果列表。 這樣,每個 id 可以有多個條目。

from functools import reduce
import pyspark.sql.functions as F

df2 = reduce(
    lambda x, y: x.withColumn(y, F.explode_outer(y)),
    df.columns[2:], 
    df.groupBy('id_product', 'value').agg(*[F.collect_list(c).alias(c) for c in df.columns[2:]])
).distinct()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM