使用SPARK写入CSV时从字符串类型数据中删除双引号

时间:2020-01-08 09:05:23

标签: java csv apache-spark

我们将Java与Spark结合使用。当前的要求是将一个数据集写入Spark,并以Space作为Delimeter。下面是我尝试过的代码:

 fooDataSetObject.coalesce(1).map((MapFunction<FooDataSet, FooDataSet>) fooDataSet -> 
 FileOperations.call(fooDataSet,broadcastedProperty),encoder).select("column","cons_zero",
            "columnA","columnB","columnC","columnD",
            "constants_value")
            .write()
            .format("com.databricks.spark.csv")
            .option("inferSchema", true)
            .option(Constants.DELIMITER, " ")
            .option(Constants.IGNORE_LEADING_WHITESPACE, ApplicationConstants.FALSE)
            .option(Constants.IGNORE_TRAILING_WHITESPACE, ApplicationConstants.FALSE)
            .option("quote", " ")
            .mode(SaveMode.Overwrite)
            .save(path);

我将QuoteMode用作None,但没有用。 当我尝试将Quote Option的值设置为“ \ u0000”时,会在文件中添加特殊字符。 我还尝试将Quote Option与明确应用UTF-8编码选项一起使用。

还有其他需要从Java或SPARK的配置方面完成的事情吗?我在提交火花作业并将编码器设置为UTF-8时尝试使用--conf作为参数。

任何帮助或建议都将受到赞赏。

样本数据集值:

|  00123400|   93115212345678|     16|       0C|Tickets Cash-back |                57695857|           602140|                24394483|                          24394483|        0|                  99|60214057695857Tic...|66754325-83d1-426...|          24|                null|   01|c28380c5-c926-4b4...|Identity Defence  |Let's Go...Rewards|             null|     null|         ON|    17|          12345678|GB 29 NWBK 12345 ...|         931152|            null|cb032911-4c4e-406...|                     null|            20987|ABC...|                 GBR|                962000|             cashback|null|X Batch        |                null|                    99|12345             |
|  00123400|   93115212345678|     17|       0C|Tickets Cash-back |                57695857|           602140|                24394483|                          24394483|        0|                  99|60214057695857Tic...|23703242-e130-48b...|          24|                null|   01|a4e52b47-8866-4d1...|Identity Defence  |Let's Go...Rewards|             null|     null|         ON|    17|          12345678|GB 29 NWBK 12345 ...|         931152|            null|ee98f2e8-f489-4f3...|                     null|            20987|ABC...|                 GBR|                962000|             cashback|null|X Batch        |                null|                    99|12345             |
|  00123400|   93115212345678|     19|       0C|Tickets Cash-back |                57695857|           602140|                24394483|                          24394483|        0|                  99|60214057695857Tic...|c7138601-b26d-49d...|          24|                null|   01|dfefcf96-4f56-4ab...|Identity Defence  |Let's Go...Rewards|             null|     null|         ON|    17|          12345678|GB 29 NWBK 12345 ...|         931152|            null|dd9027bd-4fcd-45d...|                     null|            20987|ABC...|                 GBR|                962000|             cashback|null|X Batch        |                null|                    99|12345             |
|  00123400|   93115212345678|     20|       0C|Tickets Cash-back |                57695857|           602140|                24394483|                          24394483|        0|                  99|60214057695857Tic...|63cbd563-2af4-472...|          24|                null|   01|9629f346-7dde-429...|Identity Defence  |Let's Go...Rewards|             null|     null|         ON|    17|          12345678|GB 29 NWBK 12345 ...|         931152|            null|7b9d0698-0de1-45d...|                     null|            20987|ABC...|                 GBR|                962000|             cashback|null|X Batch        |                null|                    99|12345             |

输出:

93115212345678 0 "GB 29 NWBK 12345 78978911     " 00123400 "12345             " 99 "60214057695857Tickets Cash-back 0"

2 个答案:

答案 0 :(得分:1)

请使用此代码。

.option("quote", "\"")
.option("escape", "\"")

有关更多信息,请参见CSV Data Source for Apache Spark

答案 1 :(得分:0)

阅读了以下文档。

  1. quote(默认值“):设置一个用于转义带引号的值的字符,其中分隔符可以是值的一部分。如果要关闭引号,则需要设置的不是空值,而是一个空字符串。与com.databricks.spark.csv不同。
  2. 转义(默认值):设置一个字符,用于在已加引号的值内转义引号。

现在,即使我已将代码更改为使用SEP代替DELIMETER,它也会出现相同的问题,因为Spark添加了\ u0000,它表示一个NULL字符。 试着给出一个空字符串,结果是一样的。

因此,我已转向使用Spark Text格式,并在backgroud中使用Java格式化程序来创建逗号分隔的行。