Spark 2.0 Scala - 使用转义分隔符读取csv文件

时间:2016-09-12 14:27:00

标签: csv apache-spark

我正在尝试读取使用反斜杠来转义分隔符而不是使用引号的CSV文件。我已经尝试构建没有qoutes和转义字符的DataFrameReader,但它不起作用。似乎“转义”选项只能用于转义引号字符。除了创建自定义输入格式之外,还有其他方法吗?

以下是我现在使用的选项:

  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库来解析各行。这将修复我的转义列分隔符问题,但不会转义行分隔符。

2 个答案:

答案 0 :(得分:1)

CSV阅读器似乎不支持此功能(请参阅https://github.com/databricks/spark-csv/issues/390)。

我猜测最简单的方法是手动解析你的行;虽然不是很理想,但仍然很实用,而且不太难。

您可以使用负向后置正则表达式来分割线条,例如(?<!\\), - 这将匹配任何前面没有反斜杠的逗号。

答案 1 :(得分:0)

我也遇到了与Spark-2.3相同的问题。但是当我尝试使用Apache的Spark-1.6时:默认情况下,commons-csv用于解析csv,在那里使用option("escape","\\")进行了解析 当我在Spark-1.6中使用option("parserLib","univocity")时,它开始给出错误。 所以我的理解是,无法处理它。

在Spark-2中,csv解析器是Univocity。我无法在Spark-2中使用“commons”parserlib。  我