我有一个定义列的列表:
case class ExcelColumn(colName: String, colType: String, colCode: String)
val cols = List(
ExcelColumn("Products Selled", "text", "products_selled"),
ExcelColumn("Total Value", "int", "total_value"),
)
和一个带有标题列的文件(csv) Products Selled
, Total Value
)读取为Dataframe。
val df = spark.read
.option("header", "true")
.option("inferSchema", "true")
.csv(filePath)
// csv file have header as colNames
var finalDf = df
.withColumn("row_id", monotonically_increasing_id)
.select(cols
.map(_.name.trim)
.map(col): _*)
// convert df col names as colCodes (for kudu table columns)
cols.foreach(col => finalDf = finalDf.withColumnRenamed(col.name.trim, col.colCode.trim))
在最后一行中,我将dataframe列名从 Products Selled
进入 products_selled
. 因此,finaldf是一个 var
.
我想知道是否有一个解决方案将finaldf声明为val,而不是var。
我试过下面的代码,但是 withColumnRenamed
返回一个新的Dataframe,但我不能在外部执行此操作 cols.foreach
```
cols.foreach(col => finalDf.withColumnRenamed(col.name.trim, col.colCode.trim))
2条答案
按热度按时间watbbzwu1#
更好的方法是使用
foldLeft
与withColumnRenamed
```case class ExcelColumn(colName: String, colType: String, colCode: String)
val cols = List(
ExcelColumn("Products Selled", "text", "products_selled"),
ExcelColumn("Total Value", "int", "total_value"),
)
val resultDF = cols.foldLeft(df){(acc, name ) =>
acc.withColumnRenamed(name.colName.trim, name.colCode.trim)
}
root
|-- Products Selled: integer (nullable = false)
|-- Total Value: string (nullable = true)
|-- value: integer (nullable = false)
root
|-- products_selled: integer (nullable = false)
|-- total_value: string (nullable = true)
|-- value: integer (nullable = false)
3pmvbmvn2#
使用
select
可以重命名列。重命名内部列
select
比…快foldLeft
,检查post以进行比较。试试下面的代码。
如果在中存储有效的列数据类型
ExcelColumn
case类,可以使用如下列数据类型。