由于某些字段的值未知,使用 Spark 写入 parquet 文件的数字格式异常 [重复]

Posted

技术标签:

【中文标题】由于某些字段的值未知,使用 Spark 写入 parquet 文件的数字格式异常 [重复]【英文标题】:Number format exception writing parquet file using Spark caused by some fields having unknown value [duplicate] 【发布时间】:2018-09-18 05:49:54 【问题描述】:

我正在使用带有以下架构的 spark 读取文本文件。

root
 |-- id: long (nullable = true)
 |-- name: string (nullable = true)
 |-- style: string (nullable = true)
 |-- code: integer (nullable = true)
 |-- state_code: integer (nullable = true)
 |-- post_code: integer (nullable = true)
 |-- mail: string (nullable = true)

这是我的 Scala 代码

 val myDf = sqlContext.read.format("csv")
      .option("header", "true")
      .option("inferSchema", "false")
      .schema(myschema)
      .option("delimiter", "|")
      .option("nullValue", "")
      .option("treatEmptyValuesAsNulls", "true")
      .load("Path to file")

在这个输入文件中,一些列的值为“\N”。我想用空(“”)替换所有值为“\ N”的库尔姆值。当我尝试将此数据框写为镶木地板文件时

 myDf.na.replace(myDf.columns.toSeq, Map("\\N" -> "")).write.format("parquet").save("path to output")

抛出异常

java.lang.NumberFormatException: For input string: "\N"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:12)
    at java.lang.Integer.parseInt(Integer.java:80)

通过解决问题来编写 parquet 文件有什么帮助吗?

【问题讨论】:

试试这个:Map("\\\\N" -> "")) @SCouto 没有办法仍然得到同样的异常 答案已在您之前的问题中提供。请检查一次***.com/questions/52368658/… @ChandanRay 解决方案不起作用 @Juhan 你得到我提供的解决方案的问题是什么。请检查。不要打开 2 个相同的问题。 【参考方案1】:

猜猜,异常不是在写的时候发生的,而是在读的时候发生的。

如果将 int 字段分配给 CSV 文件的架构,并且文件中的字段值包含“\N”,则会发生此类错误。

猜猜,您可以将 Parquet 中的保存替换为其他操作(显示等)并获得相同的异常。

【讨论】:

myDf .na.replace(myDf .columns,Map("\\\\N" -> "")).show() 也抛出同样的异常 请尝试不使用“na.replace”。同样从你的测试来看,这不是 Parquet 保存问题,而是阅读问题,需要另一个修复。 是的,即使 myDf .show() 也会抛出同样的异常 表示schema与CSV文件结构不匹配,可以改正。 架构已修复,读取文件时有什么方法可以替换\N

以上是关于由于某些字段的值未知,使用 Spark 写入 parquet 文件的数字格式异常 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用Spark 编码 写入 hive 的过程中 hive字段乱码 [解决方案]

使用Spark 编码 写入 hive 的过程中 hive字段乱码 [解决方案]

Spark UDAF 动态输入模式处理

Spark SQL中Dataframe join操作含null值的列

Pyspark 通过使用另一列中的值替换 Spark 数据框列中的字符串

如何使用 spark(scala)读取和写入(更新)同一个文件