python 如何在Spark中当值为空时删除双引号?

62o28rlo  于 12个月前  发布在  Python
关注(0)|答案(7)|浏览(143)

我想在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   |


如何在注册时删除双引号?
先谢谢你了。

gg0vcinb

gg0vcinb1#

根据Spark文档,nullValueemptyValue的默认值都是None,并且将导致空字符串。要将其设置为实际的 nothing,如您所愿,您可以将其设置为Unicode NULL

df.write.save(
    path('out'),
    format = 'csv',
    delimiter = '|',
    header = True,
    nullValue = '\u0000',
    emptyValue = '\u0000'
)

字符串

5gfr0r5j

5gfr0r5j2#

如果你正在寻找PySpark的方法来做这件事,不要尝试使用空字符串技巧!它更直接(一旦你知道了技巧...)

myDF.coalesce(1).write\
    .option("emptyValue", None)\
    .option("nullValue", None)\
    .csv(outFile)

字符串
希望有帮助!在任何地方都找不到记录

rbpvctlc

rbpvctlc3#

你的数据框中有空字符串,如果你想把它们写为null,你可以把空字符串替换为null,然后在保存时设置nullValues=None

df.replace('', None)              # replace empty string with null
  .write.save(
    path('out'), 
    format='csv', 
    delimiter='|', 
    header=True, 
    nullValue=None                # write null value as None
  )

字符串
它将保存为:

id|first_name|last_name|zip_code
1||Elsner|57315
2|Noelle||
3|James|Moser|48256

up9lanfz

up9lanfz4#

上面的解决方案对我都不起作用,但它们有助于引导我走向正确的方向。最终起作用的是添加选项emptyValue=u'\u0000'(当我尝试不使用前面的u时,它最终将\u0000文字写入csv文件)

wswtfjt7

wswtfjt75#

data.write.format(“csv”).option(“文件”,”|“).option(“emptyValue”,“”).option(“nullValue”,“”).option(“header”,“true”).mode(“overwrite”).保存(“C:\data\test2”)

kyks70gy

kyks70gy6#

我也有同样的问题,我找到了这里的方法。在阅读解决方案后,我继续研究source code,发现了一些有趣的事情。所以在pyspark中使用CSV格式编写DF有两种变体,而不在DF中引用空值
1.通过创建和改变DataFrameWriter对象:

df.write.format("csv").mode("overwrite")\
    .option("header", True)\
    .option("sep", "|")\
    .option("quoteAll", False)\
    .option("emptyValue", "")\
    .save("s3://...")

字符串
1.通过创建DataFrameWriter对象并调用csv()方法:

df.write.csv(
    path="s3://...",
    mode="overwrite",
    sep="|",
    header=True,
    quoteAll=False,
    emptyValue="",
)


我发现的有趣的事情是这些:
1.选项2有“无值过滤器”,但选项1没有
1.在选项1中,设置option("emptyValue", None)等同于设置option("emptyValue", "")
1.在选项2中,设置emptyValue=None没有任何作用,因为它将被忽略。
由于Spark使用univocity来处理CSV,我也深入研究了它的代码。我的猜测是:

  1. univocity有一个名为quoteNulls的参数,默认情况下为true
  2. emptyValue的默认值似乎是null,这意味着空值""将被替换为null。与quotedNulls=true结合,所有空值默认被引用。
    这些只是我的猜测,因为我不完全理解univocity中的某些代码段。有关详细信息,请参阅我刚刚打开的issue
qgelzfjb

qgelzfjb7#

在编写最终输出时-通过添加option(“nullValue”,'').option(“emptyValue”,'')对我有效-它将“”替换为空白。

相关问题