写入 Spark 数据帧时将 null 替换为空字符串

ben*_*ben 5 python null apache-spark pyspark

null将 Spark 数据帧写入文件时,有没有办法用空字符串替换列中的值?

样本数据:

+----------------+------------------+
|   UNIQUE_MEM_ID|              DATE|
+----------------+------------------+
|            1156|              null|
|            3787|        2016-07-05|
|            1156|              null|
|            5064|              null|
|            5832|              null|
|            3787|              null|
|            5506|              null|
|            7538|              null|
|            7436|              null|
|            5091|              null|
|            8673|              null|
|            2631|              null|
|            8561|              null|
|            3516|              null|
|            1156|              null|
|            5832|              null|
|            2631|        2016-07-07|
Run Code Online (Sandbox Code Playgroud)

kit*_*tes 7

看一下这个。你可以when并且otherwise

    df.show()

    #InputDF
    # +-------------+----------+
    # |UNIQUE_MEM_ID|      DATE|
    # +-------------+----------+
    # |         1156|      null|
    # |         3787|2016-07-05|
    # |         1156|      null|
    # +-------------+----------+


    df.withColumn("DATE", F.when(F.col("DATE").isNull(), '').otherwise(F.col("DATE"))).show()

    #OUTPUTDF
    # +-------------+----------+
    # |UNIQUE_MEM_ID|      DATE|
    # +-------------+----------+
    # |         1156|          |
    # |         3787|2016-07-05|
    # |         1156|          |
    # +-------------+----------+
Run Code Online (Sandbox Code Playgroud)

将上述逻辑应用于数据帧的所有列。您可以使用 for 循环并迭代列并在列值为空时填充空字符串。

 df.select( *[ F.when(F.col(column).isNull(),'').otherwise(F.col(column)).alias(column) for column in df.columns]).show()
Run Code Online (Sandbox Code Playgroud)


Shu*_*Shu 5

对于这种情况,请使用.na.fill(),函数。fillna()

  • 如果您拥有所有string列,则将所有列上的df.na.fill('')所有null替换为''
  • 对于int列,将nulldf.na.fill('').na.fill(0)替换为0
  • 另一种方法是dict为列和替换值创建df.fillna({'col1':'replacement_value',...,'col(n)':'replacement_value(n)'})

Example:

df.show()
#+-------------+----------+
#|UNIQUE_MEM_ID|      DATE|
#+-------------+----------+
#|         1156|      null|
#|         3787|      null|
#|         2631|2016007-07|
#+-------------+----------+
from pyspark.sql.functions import *

df.na.fill('').show()
df.fillna({'DATE':''}).show()
#+-------------+----------+
#|UNIQUE_MEM_ID|      DATE|
#+-------------+----------+
#|         1156|          |
#|         3787|          |
#|         2631|2016007-07|
#+-------------+----------+
Run Code Online (Sandbox Code Playgroud)

  • @ben,如果您拥有所有字符串列,则“df.na.fill('')”将在所有列上将所有“null”替换为“''”,对于 int 列“df.na.fill('')”。 na.fill(0)` 将 `null` 替换为 `0`。 (4认同)