Решение не будет работать, если testKey
отсутствует в схеме DataFrame, это приведет к ошибке No such struct field
.
Вы должны написать небольшой UDF для проверки, например:
import org.apache.spark.sql.functions.udf
import org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema
import org.apache.spark.sql.Row
spark.udf.register("struct_get", (root:GenericRowWithSchema, path: String, defaultValue: String) => {
var fields = path.split("\\.")
var buffer:Row = root
val lastItem = fields.last
fields = fields.dropRight(1)
fields.foreach( (field:String) => {
if (buffer != null) {
if (buffer.schema.fieldNames.contains(field)) {
buffer = buffer.getStruct(buffer.fieldIndex(field))
} else {
buffer = null
}
}
})
if (buffer == null) {
defaultValue
} else {
buffer.getString(buffer.fieldIndex(lastItem))
}
})
SELECT struct_get(mapColumn, "testKey", "") FROM my_table