Pyspark用NULL替换NaN

16
我使用Spark执行数据转换并将其加载到Redshift中。 Redshift不支持NaN值,因此我需要将所有NaN的出现替换为NULL。
我尝试了以下代码:
some_table = sql('SELECT * FROM some_table')
some_table = some_table.na.fill(None)

但我遇到了以下错误:

ValueError: 值应为浮点数、整数、长整数、字符串、布尔类型或字典

因此,看起来像是na.fill()不支持None。 我需要明确使用NULL进行替换,而不是其他值,如0

2个回答

29
df = spark.createDataFrame([(1, float('nan')), (None, 1.0)], ("a", "b"))
df.show()

+----+---+        
|   a|  b|
+----+---+
|   1|NaN|
|null|1.0|
+----+---+

df = df.replace(float('nan'), None)
df.show()

+----+----+
|   a|   b|
+----+----+
|   1|null|
|null| 1.0|
+----+----+
您可以使用.replace函数在一行代码中更改为null的值。

这个对我来说几乎有效。但是,我不得不使用以下代码:pd.DataFrame( df ).replace( { float( 'nan' ): None } ),请参见https://github.com/pandas-dev/pandas/issues/26050。 - Andrew

17

在Google搜索一番后,我终于找到了答案。

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(), 但它达到了相同的结果,所以我很高兴。


太棒了。这是我寻找已久的东西。谢谢你。 - Borislav Aymaliev
2
这相对于另一个答案有什么优势? - AMC
@AMC 我的回答可能没有优势。我在链接的回答发布一年前写了我的回答,直到现在才意识到有更新的回答。我也还没有能够亲自测试新的回答,所以我还不太舒服将更新的回答标记为被接受的答案。一旦我能够亲自确认它,可能需要一段时间,因为我已经转向其他问题,我会做出更改。 - user554481
@user554481 我没有注意到另一个答案的发布时间是那么晚!_我也无法自己测试新答案,所以我还不敢将新答案标记为被接受的答案。一旦我能够亲自确认它(可能需要一段时间,因为我已经开始解决其他问题),我会进行更改。_当然,最终这只是一件小事。 - AMC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接