Spark CSV阅读器引用了数字

时间:2017-06-22 17:57:36

标签: java apache-spark spark-dataframe

我目前正在使用以下代码阅读CSV数据:

Dataset<Row> dataset = getSparkSession().read()
            .option("header", "true")
            .option("quote", '"')
            .option("sep", ',')
            .schema(schema)
            .csv(path)
            .toDF();

哪个指向具有以下行的CSV文件:

"abc","city","123"

以及另一个包含如下行的文件:

"abc","city",123

第二个工作正常,因为我传递的模式是

string, string, long

第一个产生java.lang.NumberFormatException: For input string: "123"

CSV阅读器是否可以正确读取两种有效格式的CSV?假设选项通过。

我正在使用Spark 2.1.1

2 个答案:

答案 0 :(得分:1)

使用inferSchema属性自动识别列的数据类型。

var data= sparkSession.read
      .option("header", hasColumnHeader)
      .option("inferSchema", "true").csv(inputPath);

答案 1 :(得分:1)

使用你的代码实际上让我崩溃了。我怀疑使用字符而不是字符串是罪魁祸首。使用'"'.toString .option("quote",...)修复崩溃,并且有效。此外,您可能还想定义转义字符,如下面的代码所示。

在Cloudera的Spark2中,我能够使用以下内容将引用和未引用的数字解析为DecimalType,并使用预定义的模式:

spark.read
            .option("mode", "FAILFAST")
            .option("escape", "\"")
            .option("delimiter", DELIMITER)
            .option("header", HASHEADER.toString)
            .option("quote", "\"")
            .option("nullValue", null)
            .option("ignoreLeadingWhiteSpace", value = true)
            .schema(SCHEMA)
            .csv(PATH)

解析数字的示例(来自单元测试):

1.0
11
"15.23"
""
 //empty field
"0.0000000001"
1111111111111.
 000000000. //with leading space

这也适用于我对IntegerType的测试 - 无论引号如何,都可以解析它。