我正在尝试读取使用反斜杠来转义分隔符而不是使用引号的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库来解析各行。这将修复我的转义列分隔符问题,但不会转义行分隔符。
答案 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。 我