簡體   English   中英

Spark:使用不同的列數加載CSV

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM