Spark 2.0 Scala - 读取具有转义分隔符的csv文件

3
我将尝试读取使用反斜杠来转义分隔符的CSV文件,而不是使用引号。我尝试了使用带有转义字符的DataFrameReader构造函数以及不使用引号的构造函数,但它们都无法正常工作。似乎“escape”选项只能用于转义引号字符。除了创建自定义输入格式之外,还有其他方法吗?
以下是我现在正在使用的选项:
  spark.read.options(Map(
    "sep" -> ",",
    "encoding" -> "utf-8",
    "quote" -> "",
    "escape" -> "\\",
    "mode" -> "PERMISSIVE",
    "nullValue" -> ""

例如,假设我们有以下示例数据:
架构:名称,城市
    Joe Bloggs,Dublin\,Ireland
    Joseph Smith,Salt Lake City\,\
    Utah

那应该返回2条记录:
  Name           |       City
-----------------|---------------
Joe Bloggs       | Dublin,Ireland
Joseph Smith     | Salt Lake City,
Utah

能够忽略换行符会很好,但必须忽略列分隔符。目前我想通过使用spark.textFile读取行,然后使用CSV库解析每行来解决转义列分隔符的问题。这将解决我的列分隔符问题,但不是行分隔符的问题。

我认为你是正确的,请查看 - Ram Ghadiyaram
Spark 2.0实际上将databricks csv InputFormat折叠到DataFrameReader中。我还没有尝试恢复到databricks版本,但迄今为止我看到的没有任何迹象表明它会有不同的行为。 - Paul Zaczkiewicz
2个回答

1

看起来CSV读取器不支持这个功能(请参见https://github.com/databricks/spark-csv/issues/390)。

我猜最简单的方法是手动解析行;虽然不太理想,但仍然可行且不太难。

您可以使用负回顾正则表达式分割行,例如(?<!\\), - 这将匹配任何未在反斜杠之前的逗号。


0

我在使用Spark-2.3时遇到了同样的问题。但是当我尝试使用Spark-1.6时,它默认使用Apache: commons-csv来解析csv文件,使用option("escape","\\")选项可以成功解析。 当我在Spark-1.6中使用option("parserLib","univocity")时,就会出现错误。 因此,我的理解是univocity无法处理它。

在Spark-2中,csv解析器是Univocity。我无法在Spark-2中使用"commons"解析器库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接