Sparklyr 忽略行分隔符

Posted

技术标签:

【中文标题】Sparklyr 忽略行分隔符【英文标题】:Sparklyr ignoring line delimiter 【发布时间】:2018-03-25 23:26:45 【问题描述】:

我正在尝试在 sparklyr 中读取 2GB~(5mi 行)的 .csv 文件:

bigcsvspark <- spark_read_csv(sc, "bigtxt", "path", 
                              delimiter = "!",
                              infer_schema = FALSE,
                              memory = TRUE,
                              overwrite = TRUE,
                              columns = list(
                                  SUPRESSED COLUMNS AS = 'character'))

并得到以下错误:

Job aborted due to stage failure: Task 9 in stage 15.0 failed 4 times, most recent failure: Lost task 9.3 in stage 15.0 (TID 3963,
10.1.4.16):  com.univocity.parsers.common.TextParsingException: Length of parsed input (1000001) exceeds the maximum number of characters defined in your parser settings (1000000). Identified line separator characters in the parsed content. This may be the cause of the error. The line separator in your parser settings is set to '\n'. Parsed content: ---lines of my csv---[\n]
---begin of a splited line --- Parser Configuration: CsvParserSettings:     ... default settings ...

和:

CsvFormat:
    Comment character=\0
    Field delimiter=!
    Line separator (normalized)=\n
    Line separator sequence=\n
    Quote character="
    Quote escape character=\
    Quote escape escape character=null Internal state when error was thrown:
        line=10599, 
        column=6, 
        record=8221, 
        charIndex=4430464, 
        headers=[---SUPRESSED HEADER---], 
        content parsed=---more lines without the delimiter.---

如上所示,在某些时候行分隔符开始被忽略。在纯 R 中可以毫无问题地读取,只需 read.csv 传递路径和分隔符。

【问题讨论】:

按照作者的建议,尝试使用 Dplyrs 过滤器来删除/识别不需要的行。 github.com/rstudio/sparklyr/issues/83 我会试试的,起初我怀疑缓冲区无法处理数据,但由于数据非常混乱,可能是数据问题,我也在尝试编写 Scala 脚本以转换为 Parquet。 【参考方案1】:

看起来该文件不是真正的 CSV,我想知道 spark_read_text() 在这种情况下是否会更好地工作。您应该能够将所有行导入 Spark,并将这些行拆分为内存中的字段,最后一部分将是最棘手的。

【讨论】:

以上是关于Sparklyr 忽略行分隔符的主要内容,如果未能解决你的问题,请参考以下文章

杰克逊:解析xml忽略行分隔符

如何从制表符分隔的数据文件中平均列值,忽略标题行和左列?

Sparklyr:如何将列表列分解为Spark表中自己的列?

cin读入string对象

第二周_文本处理

使用 RegEx 忽略分隔符前的特定字符