Spark文件格式转义\n加载CSV

Spark文件格式转义\n加载CSV,csv,apache-spark,apache-spark-sql,Csv,Apache Spark,Apache Spark Sql,我正在使用spark读取CSV管道分隔的数据文件。这是合格的报价。文本块中有A/n,导致读取损坏。我不明白的是,这是引用限定的文本,所以肯定应该跳过它!?行本身由CR+LN分隔 反正不是。我该怎么做?我可以用萃取物把它们洗掉,但对我来说似乎不那么优雅 这是我用来加载数据的 val sch = spark.table("db.mytable").schema val df = spark.read .format("csv") .schema(sch) .option("header"

我正在使用spark读取CSV管道分隔的数据文件。这是合格的报价。文本块中有A/n,导致读取损坏。我不明白的是,这是引用限定的文本,所以肯定应该跳过它!?行本身由CR+LN分隔

反正不是。我该怎么做?我可以用萃取物把它们洗掉,但对我来说似乎不那么优雅

这是我用来加载数据的

val sch = spark.table("db.mytable").schema
val df = spark.read
  .format("csv")
  .schema(sch)
  .option("header", "true")
  .option("delimiter", "|")
  .option("mode", "PERMISSIVE")
  .option("quote", "\"")
  .load("/yadaydayda/mydata.txt")

通过最初在提取物上对它们进行条带化来解决这个问题。然而,我最终决定的解决方案是在extract上使用拼花地板格式,然后所有这些问题都消失了。

很高兴知道我不是Spark中唯一处理这个问题的人

Spark逐行读取文件,因此带有换行符的CSV会给解析器带来问题。逐行阅读可以让Spark更容易处理大型CSV文件,而不是试图解析所有引用内容,这会严重影响案例的性能。在尝试进行高性能分析时,这很可能不是问题


对于可能出现换行符的情况,我使用了第三方CSV解析库,通过该库运行CSV“行”(这将正确处理换行符),剥离换行符,将文件写入/缓存到某个位置,然后从缓存的文件中读取。对于生产用例,这些文件将被加载到数据库中,或者对于日志文件或您不想将它们加载到数据库中的其他文件,使用您建议的拼花地板效果非常好,或者实际上只是在文件触发之前在某个地方强制缺少换行符。

CSV格式没有共识;尽管有一个RFC,但许多解析器并不完全支持它,而且确实支持它的解析器无论如何都会超越它(例如,我认为RFC中不包含用于嵌入引号的自定义转义字符)。在这些健壮的解析器中,有些是开源的。。。但不一定要有允许Apache项目使用它们的许可证。底线:使用
uniVocity
Javalib实现您自己的解析器实用程序,然后将记录管道化到数据帧中。祝你好运。是的,经过一番考虑,对于任何平台来说,转义记录分隔符都是非常困难的。我认为方法是更全面地考虑数据工程问题,尽可能避免txt解析(例如,使用数据提供工具(如data factory)中的功能将其转换为键入格式),或者在准备阶段之前将其清除到上游