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

62o28rlo  于 2024-01-05  发布在  Python
关注(0)|答案(7)|浏览(187)

我想在S3中使用Spark的方法df.write.save()注册CSV时,当值为空时删除双引号“”
Spark版本:2.4.0
Python版本:3.6.5
下面是我在Python中加载csv文件的代码:

  1. df = spark.read.load(
  2. path('in'),
  3. format = 'csv',
  4. delimiter = '|',
  5. encoding = 'utf-8',
  6. header = 'true'
  7. )

字符串
加载的CSV文件:

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


下面是我用Python编写的csv文件代码:

  1. df.write.save(
  2. path('out'),
  3. format = 'csv',
  4. delimiter = '|',
  5. header = 'true'
  6. )


CSV文件写入:

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


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

gg0vcinb

gg0vcinb1#

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

  1. df.write.save(
  2. path('out'),
  3. format = 'csv',
  4. delimiter = '|',
  5. header = True,
  6. nullValue = '\u0000',
  7. emptyValue = '\u0000'
  8. )

字符串

5gfr0r5j

5gfr0r5j2#

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

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

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

rbpvctlc

rbpvctlc3#

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

  1. df.replace('', None) # replace empty string with null
  2. .write.save(
  3. path('out'),
  4. format='csv',
  5. delimiter='|',
  6. header=True,
  7. nullValue=None # write null value as None
  8. )

字符串
它将保存为:

  1. id|first_name|last_name|zip_code
  2. 1||Elsner|57315
  3. 2|Noelle||
  4. 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对象:

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

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

  1. df.write.csv(
  2. path="s3://...",
  3. mode="overwrite",
  4. sep="|",
  5. header=True,
  6. quoteAll=False,
  7. emptyValue="",
  8. )


我发现的有趣的事情是这些:
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”,'')对我有效-它将“”替换为空白。

相关问题