读取 CSV 后具有奇怪值的 Spark 数据帧

Posted

技术标签:

【中文标题】读取 CSV 后具有奇怪值的 Spark 数据帧【英文标题】:Spark dataframe with strange values after reading CSV 【发布时间】:2021-01-15 10:58:41 【问题描述】:

来自here,我正在尝试从 Pyspark 中的this dataset 读取正确的值。我使用df = spark.read.csv("hashtag_donaldtrump.csv", header=True, multiLine=True) 取得了不错的进展,但现在我在某些单元格中有一些奇怪的值,正如您在这张图片中看到的(最后几行):

你知道我怎样才能摆脱它们吗?或者,如何使用其他程序读取格式的 CSV?我很难使用像 Vim 或 Nano 这样的文本编辑器来猜测错误在哪里。谢谢!

【问题讨论】:

【参考方案1】:

Spark 似乎很难读懂这一行:

2020-10-15 00:00:23,1.3165293165079306e+18,"""IS THIS WRONG??!!"" ...

因为有三个双引号。但是 pandas 似乎很了解这一点,因此作为一种解决方法,您可以先使用 pandas 读取 csv 文件,然后转换为 Spark 数据帧。通常不建议这样做,因为涉及的开销很大,但对于这个小的 csv 文件,性能损失应该是可以接受的。

df = spark.createDataFrame(pd.read_csv('hashtag_donaldtrump.csv').replace(float('nan'): None))

replace 用于将 pandas 数据框中的 nan 替换为 None。 Spark 认为nan 是一个浮点数,当字符串类型列中有nan 时它会感到困惑。

如果文件对于 pandas 来说太大,那么您可以考虑删除那些 Spark 无法使用 mode='DROPMALFORMED' 解析的行:

df = spark.read.csv('hashtag_donaldtrump.csv', header=True, multiLine=True, mode='DROPMALFORMED')

【讨论】:

我收到此错误:Error tokenizing data. C error: Buffer overflow caught - possible malformed input file。我不知道我是否遗漏了什么 @Awacate 试试pd.read_csv('trump.csv', engine='python') 吗? 对不起,我忘了说我也试过了,它给了我一个错误,说我没有足够的内存或类似的东西,这很奇怪,因为我使用的是 AWS 实例16GB 内存...我也尝试使用 lineSeparator 选项,得到与引擎选项相同的错误 @Awacate 你能试试我编辑的答案的最后一行吗?

以上是关于读取 CSV 后具有奇怪值的 Spark 数据帧的主要内容,如果未能解决你的问题,请参考以下文章

是否可以以相同或不同的顺序将具有相同标题或标题子集的多个 csv 文件读取到 spark 数据帧中?

pyspark读取csv文件multiLine选项不适用于具有换行符spark2.3和spark2.2的记录

当函数在具有自动检测模式的 spark 数据帧中不起作用时

Pyspark:将df写入具有特定名称的文件,绘制df

Scala:从带有列的csv读取数据具有空值

使用 Spark 验证 CSV 文件列