Scala Spark:加载具有不同列数的CSV

Scala Spark:加载具有不同列数的CSV,scala,apache-spark,Scala,Apache Spark,我正在使用Spark的CSV加载器加载CSV文件,并通过提供案例类模式和使用.as[T]将其转换为特定的数据集 spark.read .option("header", "false") .option("dateFormat", "yyyy-MM-dd HH:mm:ss.SSS") .schema(schemaOf[T]) .csv(filePath) .as[T] 我的问题是,我有多个系统发送相同的文件和 假设某个系统发送的文件包含的列少于我定义的模式中的两列 然后我想

我正在使用Spark的CSV加载器加载CSV文件,并通过提供
案例类
模式和使用
.as[T]
将其转换为特定的
数据集

spark.read
  .option("header", "false")
  .option("dateFormat", "yyyy-MM-dd HH:mm:ss.SSS")
  .schema(schemaOf[T])
  .csv(filePath)
  .as[T]
我的问题是,我有多个系统发送相同的文件和 假设某个系统发送的文件包含的列少于我定义的
模式中的两列
然后我想为这两列设置
null
,并加载所有其他列

对于所有其他系统,在按照
模式发送时加载所有字段


我如何以有效的方式进行此操作?我不想为每个系统创建
案例类

在转换到
数据集之前,您可以先将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"))

在转换为
数据集之前,您可以先将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"))

您可以使用.laod数据,如果模式中的列null define nullable您的意思是说输入csv文件本身对某些列没有值,还是对相应的列有空数据?它甚至不会有一些列,就像实际的
案例类
模式
有25列一样,那么它可以有23列(22个逗号).You can.laod data,如果schema define nullable中的列为null,您的意思是说输入csv文件本身对某些列没有值,还是对相应列有空数据?它甚至不会有一些列,就像实际的
case class
schema
有25列一样,那么它可以有23列(22个逗号).