我正在使用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
。
答案 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"))