读取 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 数据帧中?