java - Spark CSV Reader 引用数字

标签 java apache-spark apache-spark-sql

我目前正在使用以下代码读取 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/

相关文章:

java - 类似的输入对话框创建模式/Swing

Javascript .apply() 方法在 Java 中是否等效?

hadoop - 为什么 Spark 可以选择下载预构建的 MapReduce 4.x?

python - 如何在pyspark中打印具有特征名称的随机森林的决策路径?

scala - 如何在数据帧中引用广播变量

pyspark - 错误 : TimestampType can not accept object while creating a Spark dataframe from a list

java - 如何在 Java 中重用一个线程?

java - 如何将具有过滤功能的嵌套复杂属性添加到 Vaadin 7 Grid?

scala - 带密码保护的 Spark 数据帧输出压缩(gzip)

python - 如何从列表中选择多个不连续的列到python中的另一个数据框中