Pyspark用NULL替换NaN
我使用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
。
-
谷歌搜索了一下之后,我终于找到了答案。
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()
,但是它实现了相同的结果,所以我很高兴。