簡體   English   中英

如何將左連接操作的 output 中的 null 值替換為 pyspark 中的 0?

[英]How to replace null values in the output of a left join operation with 0 in pyspark dataframe?

我有一個簡單的 PySpark dataframe, df1-

df1 = spark.createDataFrame([
    ("u1", 1),
    ("u1", 2),
    ("u2", 3),
    ("u3", 4),

    ],
    ['user_id', 'var1'])

print(df1.printSchema())
df1.show(truncate=False)

輸出-

root
 |-- user_id: string (nullable = true)
 |-- var1: long (nullable = true)

None
+-------+----+
|user_id|var1|
+-------+----+
|u1     |1   |
|u1     |2   |
|u2     |3   |
|u3     |4   |
+-------+----+

我還有另一個 PySpark dataframe df2-

df2 = spark.createDataFrame([
    (1, 'f1'),
    (2, 'f2'),

    ],
    ['var1', 'var2'])

print(df2.printSchema())
df2.show(truncate=False)

輸出-

root
 |-- var1: long (nullable = true)
 |-- var2: string (nullable = true)

None
+----+----+
|var1|var2|
+----+----+
|1   |f1  |
|2   |f2  |
+----+----+

我必須通過對它們使用左連接操作來連接上面提到的兩個數據框-

df1.join(df2, df1.var1==df2.var1, 'left').show()

輸出-

+-------+----+----+----+
|user_id|var1|var1|var2|
+-------+----+----+----+
|     u1|   1|   1|  f1|
|     u1|   2|   2|  f2|
|     u2|   3|null|null|
|     u3|   4|null|null|
+-------+----+----+----+

但正如您所看到的,我在兩個表不匹配的行中得到 null 值。 如何將所有 null 值替換為 0?

您可以使用fillna 需要兩個 fillnas 來說明 integer 和字符串列。

df1.join(df2, df1.var1==df2.var1, 'left').fillna(0).fillna("0")

您可以在join后重命名列(否則您將獲得具有相同名稱的列)並使用字典來指定您希望如何填充缺失值:

f1.join(df2, df1.var1 == df2.var1, 'left').select(
    *[df1['user_id'], df1['var1'], df2['var1'].alias('df2_var1'), df2['var2'].alias('df2_var2')]
).fillna({'df2_var1': 0, 'df2_var2': '0'}).show()

Output:

+-------+----+--------+--------+
|user_id|var1|df2_var1|df2_var2|
+-------+----+--------+--------+
|     u1|   1|       1|      f1|
|     u2|   3|       0|       0|
|     u1|   2|       2|      f2|
|     u3|   4|       0|       0|
+-------+----+--------+--------+

暫無
暫無

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

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