如何使用spark-csv解析使用^A(即\001)作为分隔符的csv文件?

15

我对Spark、Hive、大数据和Scala等内容非常陌生,现在我需要编写一个简单的函数来获取SQLContext并从S3加载CSV文件返回DataFrame。问题是这个CSV文件使用^A(即\001)字符作为分隔符,数据集很大,因此我不能只是在它上面执行“s/\001/,/g”命令。此外,字段中可能包含逗号或其他我可能用作分隔符的字符。

我知道我正在使用的spark-csv软件包有一个分隔符选项,但我不知道如何设置它以使其将\001视为一个字符而不是转义的0、0和1。也许我应该使用hiveContext或其他东西?

(Note: HTML tags preserved)
2个回答

30

如果您查看GitHub页面,spark-csv有一个delimiter参数(正如您所指出的)。 使用方法如下:

如果你检查 GitHub 页面,对于 spark-csv 有一个 `delimiter` 参数(正如你也注意到的)。像这样使用它:
val df = sqlContext.read
    .format("com.databricks.spark.csv")
    .option("header", "true") // Use first line of all files as header
    .option("inferSchema", "true") // Automatically infer data types
    .option("delimiter", "\u0001")
    .load("cars.csv")

谢谢!我不知道\u0是什么意思。你能详细解释一下它的含义和作用吗?我猜‘u’代表unicode,但我想要更好地理解这个东西。 - user2535982
2
好的,\字符标志着转义序列的开始,意味着接下来的字符不是字符串的一部分,而是具有特殊含义的字符。u字符表示接下来的数字是一个字符的Unicode代码,而0001是该特殊字符的Unicode代码。所以它的作用就是在字符串中插入该特殊字符。 - Daniel Zolnai
8
如果您正在使用Pyspark,请使用'\x01'作为分隔符。 - ghosts
1
以上解决方案是否有效? .option("delimiter", "\u0001")。它给我返回一个错误,如下所示:java.lang.IllegalArgumentException: 不支持的分隔符特殊字符:\u0001 at org.apache.spark.sql.execution.datasources.csv.CSVUtils$.toChar(CSVUtils.scala:106) at org.apache.spark.sql.execution.datasources.csv.CSVOptions.<init>(CSVOptions.scala:83) at org.apache.spark.sql.execution.datasources.csv.CSVOptions.<init>(CSVOptions.scala:39) - vinu.m.19
如果您正在使用Spark 2.x,则使用内置的csv解析器,目前不支持将任何字符设置为分隔符。 - Daniel Zolnai
这个答案对我有用:https://dev59.com/6VYO5IYBdhLWcg3wHd5o#46349762 - fstang

3

使用Spark 2.x和CSV API时,请使用sep选项:

val df = spark.read
  .option("sep", "\u0001")
  .csv("path_to_csv_files")

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