我有Spark 1。5.0 DataFrame在同一列中混合了null
和空字符串。我想将所有列中的所有空字符串转换为null
(None
,在Python中)。DataFrame可能有数百个列,所以我试图避免对每一列进行硬编码操作。
请参阅下面的尝试,结果出现错误。
from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
## Create a test DataFrame
testDF = sqlContext.createDataFrame([Row(col1='foo', col2=1), Row(col1='', col2=2), Row(col1=None, col2='')])
testDF.show()
## +----+----+
## |col1|col2|
## +----+----+
## | foo| 1|
## | | 2|
## |null|null|
## +----+----+
## Try to replace an empty string with None/null
testDF.replace('', None).show()
## ValueError: value should be a float, int, long, string, list, or tuple
## A string value of null (obviously) doesn't work...
testDF.replace('', 'null').na.drop(subset='col1').show()
## +----+----+
## |col1|col2|
## +----+----+
## | foo| 1|
## |null| 2|
## +----+----+
9条答案
按热度按时间myzjeezk1#
就这么简单:
如果您想填充多个列,您可以例如减少:
或使用理解:
如果你想具体操作字符串字段,请检查the answer by robin-loxley。
voj3qocg2#
UDF的效率不是很高。使用内置方法的正确方法是:
kzipqqlq3#
简单地加上zero323和soulmachine的答案。转换所有StringType字段。
r6vfmomb4#
我的解决方案比我迄今为止看到的所有解决方案都要好得多,它可以处理尽可能多的字段,请参阅以下小函数:
你可以很容易地在Python中重写上面的函数。
这一招是跟@连城学的
kqhtkvqz5#
如果你使用的是Python,你可以检查以下内容。
hk8txs486#
我会在@zero323的solution中添加一个
trim
来处理多白色的情况:2sbarzqh7#
感谢@zero323、@Tomerikoo和@Robin Loxley
即用功能:
ktecyv1j8#
这有助于我净化价值观。
对于所有列:
对于特定列:
czq61nw19#
这是soulmachine解决方案的不同版本,但我不认为你可以很容易地将其翻译成Python: