Я пытаюсь изменить схему кадра данных. каждый раз, когда у меня есть столбец строкового типа, я хочу изменить его тип на VarcharType (max), где max - это максимальная длина строки в этом столбце. я написал следующий код. (Я хочу экспортировать фрейм данных позже на sql сервер, и я не хочу иметь nvarchar на sql сервере, поэтому я пытаюсь ограничить его на стороне искры)
val df = spark.sql(s"SELECT * FROM $tableName")
var l : List [StructField] = List()
val schema = df.schema
schema.fields.foreach(x => {
if (x.dataType == StringType) {
val dataColName = x.name
val maxLength = df.select(dataColName).reduce((x, y) => {
if (x.getString(0).length >= y.getString(0).length) {
x
} else {
y
}
}).getString(0).length
val dataType = VarcharType(maxLength)
l = l :+ StructField(dataColName, dataType)
} else {
l = l :+ x
}
})
val newSchema = StructType(l)
val newDf = spark.createDataFrame(df.rdd, newSchema)
Однако когда запустив его, я получаю эту ошибку.
20/01/22 15:29:44 ERROR ApplicationMaster: User class threw exception: scala.MatchError:
VarcharType(9) (of class org.apache.spark.sql.types.VarcharType)
scala.MatchError: VarcharType(9) (of class org.apache.spark.sql.types.VarcharType)
Может ли столбец данных иметь тип VarcharType (n)?