Spark:使用不同的列数加载CSV

时间:2019-03-25 21:02:29

标签: scala apache-spark

我正在使用Spark的csv加载器加载CSV文件,并通过提供Dataset模式并使用case class将其转换为特定的.as[T]

spark.read
  .option("header", "false")
  .option("dateFormat", "yyyy-MM-dd HH:mm:ss.SSS")
  .schema(schemaOf[T])
  .csv(filePath)
  .as[T]

我的问题是,我有多个系统发送相同的文件, 说一个系统是否正在发送一个文件,该文件包含的行数少于我定义的schema中的两列 那么我只想将null放在这两列中,并加载所有其他列。

对于所有其他系统,在发送时遵循schema加载所有字段。

如何有效地做到这一点?我不想为每个系统创建case class

1 个答案:

答案 0 :(得分:2)

在转换为Dataframe之前,您可以先将Dataset的csv数据进行处理。这样,您可以轻松添加/删除列,以将案例类与实用程序功能相匹配:

implicit class DataFrameOps(df: DataFrame) {
  def withColumnIfNotExists(colName: String, col: Column): DataFrame = {
    if(df.columns.contains(colName)) df
    else df.withColumn(colName, col)
  }
}

// then use it like this
???.csv(filePath).withColumnIfNotExists("missing_col", lit(null).cast("string"))