我想在S3中使用Spark的方法df.write.save()注册CSV时,当值为空时删除双引号“”
Spark版本:2.4.0
Python版本:3.6.5
下面是我在Python中加载csv文件的代码:
df = spark.read.load(
path('in'),
format = 'csv',
delimiter = '|',
encoding = 'utf-8',
header = 'true'
)
字符串
加载的CSV文件:
|id|first_name|last_name|zip_code|
|1 | |Elsner |57315 |
|2 |Noelle | | |
|3 |James |Moser |48256 |
型
下面是我用Python编写的csv文件代码:
df.write.save(
path('out'),
format = 'csv',
delimiter = '|',
header = 'true'
)
型
CSV文件写入:
|id|first_name|last_name|zip_code|
|1 |"" |Elsner |57315 |
|2 |Noelle |"" |"" |
|3 |James |Moser |48256 |
型
如何在注册时删除双引号?
先谢谢你了。
7条答案
按热度按时间gg0vcinb1#
根据Spark文档,
nullValue
和emptyValue
的默认值都是None
,并且将导致空字符串。要将其设置为实际的 nothing,如您所愿,您可以将其设置为UnicodeNULL
:字符串
5gfr0r5j2#
如果你正在寻找PySpark的方法来做这件事,不要尝试使用空字符串技巧!它更直接(一旦你知道了技巧...)
字符串
希望有帮助!在任何地方都找不到记录
rbpvctlc3#
你的数据框中有空字符串,如果你想把它们写为null,你可以把空字符串替换为null,然后在保存时设置
nullValues=None
:字符串
它将保存为:
型
up9lanfz4#
上面的解决方案对我都不起作用,但它们有助于引导我走向正确的方向。最终起作用的是添加选项
emptyValue=u'\u0000'
(当我尝试不使用前面的u
时,它最终将\u0000
文字写入csv文件)wswtfjt75#
data.write.format(“csv”).option(“文件”,”|“).option(“emptyValue”,“”).option(“nullValue”,“”).option(“header”,“true”).mode(“overwrite”).保存(“C:\data\test2”)
kyks70gy6#
我也有同样的问题,我找到了这里的方法。在阅读解决方案后,我继续研究source code,发现了一些有趣的事情。所以在pyspark中使用CSV格式编写DF有两种变体,而不在DF中引用空值:
1.通过创建和改变
DataFrameWriter
对象:字符串
1.通过创建
DataFrameWriter
对象并调用csv()
方法:型
我发现的有趣的事情是这些:
1.选项2有“无值过滤器”,但选项1没有
1.在选项1中,设置
option("emptyValue", None)
等同于设置option("emptyValue", "")
1.在选项2中,设置
emptyValue=None
没有任何作用,因为它将被忽略。由于Spark使用univocity来处理CSV,我也深入研究了它的代码。我的猜测是:
univocity
有一个名为quoteNulls
的参数,默认情况下为true
emptyValue
的默认值似乎是null
,这意味着空值""
将被替换为null
。与quotedNulls=true
结合,所有空值默认被引用。这些只是我的猜测,因为我不完全理解
univocity
中的某些代码段。有关详细信息,请参阅我刚刚打开的issue。qgelzfjb7#
在编写最终输出时-通过添加option(“nullValue”,'').option(“emptyValue”,'')对我有效-它将“”替换为空白。