【问题标题】:Pyarrow Find bad lines in csv to parquet conversionPyarrow Find bad lines in csv to parquet转换
【发布时间】:2021-09-14 04:44:41
【问题描述】:

我在将大型 csv 转换为镶木地板时收到 CSV column #10: CSV conversion error to string: invalid UTF8 data。从错误的外观来看,由于存在无效的 utf-8 字符,因此似乎无法将适当的列数据转换为 String 类型。

也许这可以通过在 pyarrow.ReadOptions 中使用正确的编码方案来解决。但我很想知道导致错误的线路。

由于它是一个包含数百万行的大文件,我无法识别导致错误的行。

pyarrow read_csv 函数中是否有任何选项来报告坏行?或者如果我们可以用NAN OR NULL 替换那个特定的单元格会更好。

【问题讨论】:

  • 你有可重现的例子吗?您可以添加此选项convert_options=csv.ConvertOptions(column_types={"#10": pa.binary()})。它将“#10”列视为二进制字符串。然后,一旦加载了数据,您就可以尝试找出哪一行不兼容 utf8。不幸的是,箭头没有 compute 函数来检查字符串是否是有效的 utf-8 数据(据我所知),所以你必须手动运行检查。

标签: python pyarrow


【解决方案1】:

今天没有选择报告行号或失败的行。有一些正在进行的工作来改进错误处理,但即使这项工作还没有揭示解码错误的行数。我建议创建一个 JIRA 问题。

正如@0x26res 正确说明的那样,您可以将列指定为二进制,然后在内存中手动检查它。您可以使用 cast 计算函数将二进制转换为字符串,这将执行 UTF8 验证,但不幸的是,它今天也不会报告失败的索引。

作为一种解决方法,您可以使用 pandas CSV 解析器,它应该为您提供失败的字节偏移量:

>>> import pandas
>>> pandas.read_csv("/tmp/blah.csv")
Traceback (most recent call last):
  ... # Omitted for brevity
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 29: invalid start byte

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-15
    • 2016-01-02
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    相关资源
    最近更新 更多