因此,使用spark.read.csv处理空值并始终获取String类型

时间:2019-03-06 18:40:34

标签: apache-spark

我有一个像这样的文件:

1,ITEM_001,CAT_01,true,2,50,4,0,false,2019-01-01,2019-01-28,true
1,ITEM_001,CAT_01,true,2,60,4,0,false,2019-01-29,2019-12-32,true
1,ITEM_002,CAT_02,true,2,50,"","",false,2019-01-01,2019-11-22,true

如果架构很大,我不想推断架构。我试图映射到案例类记录,但是由于某种原因,事情还没完成

因此,我正在执行以下操作:

val dfPG = spark.read.format("csv")
                .option("header", "true")
                .option("inferSchema", "false")
                .option("nullValue", "")
                .load("/FileStore/tables/SO_QQQ.txt") 

并显式设置字段:

val dfPG2 =
      dfPG
         .map {r => (r.getString(0).toLong, r.getString(1), r.getString(2), r.getString(3).toBoolean, r.getString(4).toInt, r.getString(5).toInt,
             r.getString(6)     //r.getString(6).toInt
            ) }

我似乎无法处理null值,也无法设置为Integer的类型。在有null值的地方,我得到String,但是我想要Int,但是在每种可能的方法上都出错。

请参阅//。以下失败,出现null异常,由于某种原因,我无法在此处制定检查逻辑?有没有更简单的方法。

r.getString(6).toInt

我一定太过复杂和/或缺少某些东西。

只需添加,当使用Option通过Seq加载到数据帧时,一切正常。这是文件输入。

1 个答案:

答案 0 :(得分:1)

那只是做事的不正确方法。而不是手动进行映射(效率低下且极易出错),您应该为数据定义一个架构

import org.apache.spark.sql.types._

val schema = StructType(Seq(
  StructField(...),
  StructField(...),
  StructField(...),
  StructField(...),
  StructField(...),
  StructField(...),
  StructField("your_integer_field", IntegerType, true),
  ...
))

并提供给读者:

val dfPG = spark.read.format("csv")
  .schema(schema)
  ...
  .load("/FileStore/tables/SO_QQQ.txt")