[英]Spark: Loading CSV with different no of columns
我正在使用Spark的csv加載器加載CSV文件,並通過提供case class
模式並使用.as[T]
將其轉換為特定的Dataset
。
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
。
您可以Dataframe
csv數據作為Dataframe
然后再轉換為Dataset
。 這樣,您可以輕松添加/刪除列,以將案例類與實用程序函數進行匹配,例如:
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"))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.