我目前正在使用以下代码读取 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
最佳答案
使用你的代码对我来说实际上会崩溃。我怀疑使用字符而不是字符串是罪魁祸首。使用 '"'.toString
for .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
测试 - 无论引号如何,都可以对其进行解析。
关于java - Spark CSV Reader 引用数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44706398/