Pyspark用NULL替换NaN

发布于 2021-01-29 16:23:55

我使用Spark执行加载到Redshift的数据转换。Redshift不支持NaN值,因此我需要将所有出现的NaN替换为NULL。

我尝试过这样的事情:

some_table = sql('SELECT * FROM some_table')
some_table = some_table.na.fill(None)

但是我遇到了以下错误:

ValueError:值应为float,int,long,string,bool或dict

因此,似乎na.fill()不支持无。我特别需要替换为NULL,而不是其他一些值,例如0

关注者
0
被浏览
141
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    谷歌搜索了一下之后,我终于找到了答案。

    df = spark.createDataFrame([(1, float('nan')), (None, 1.0)], ("a", "b"))
    df.show()
    
    +----+---+
    |   a|  b|
    +----+---+
    |   1|NaN|
    |null|1.0|
    +----+---+
    
    import pyspark.sql.functions as F
    columns = df.columns
    for column in columns:
        df = df.withColumn(column,F.when(F.isnan(F.col(column)),None).otherwise(F.col(column)))
    
    sqlContext.registerDataFrameAsTable(df, "df2")
    sql('select * from df2').show()
    
    +----+----+
    |   a|   b|
    +----+----+
    |   1|null|
    |null| 1.0|
    +----+----+
    

    它没有使用na.fill(),但是它实现了相同的结果,所以我很高兴。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看