Pyspark用空替换NaN

2024-05-23 19:08:34 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我试过这样的方法:

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

但我犯了以下错误:

ValueError: value should be a float, int, long, string, bool or dict

所以看起来na.fill()不支持None。我特别需要替换为NULL,而不是其他值,比如0


Tags: 数据方法fromnoneredshiftsql错误table
2条回答
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值。

我在网上搜索了一下,终于找到了答案。

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

相关问题 更多 >