В Scala Spark, как добавить значения по умолчанию для производных столбцов, когда исходный столбец равен NULL? - PullRequest
0 голосов
/ 03 августа 2020

У меня есть столбец «студенты» со следующей схемой

    root
 |-- t1: integer (nullable = true)
 |-- t2: integer (nullable = true)
 |-- StudentsInfo: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- rollNumber: integer (nullable = true)
 |    |    |-- complaints: map (nullable = true)
 |    |    |    |-- key: string
 |    |    |    |-- value: struct (valueContainsNull = true)
 |    |    |    |    |-- severityOfComplaintX: integer (nullable = true)
 |    |    |    |    |-- numInstancesofComplaintX: integer (nullable = true)

Я хочу преобразовать этот столбец «studentInfo» в два производных столбца

Я получаю следующие два столбца (каждый типа "Map"): "compaintSeverityOfComplaintX" "compaintNumInstancesofComplaintX".

Здесь понимание запроса может не иметь значения. Это некий рабочий запрос, который извлекает два столбца (тип: Map) из столбца типа «Студенты»

Но проблема в том, когда значение столбца («studentInfo») равно NULL. Он пропускает всю строку (как и ожидалось).

Я хочу обновить свой SQL запрос, чтобы, когда значение столбца «studentInfo» для rowX равно NULL, он должен добавить пустую MAP в качестве значения для производных столбцов »compaintSeverityOfComplaintX "и" compaintNumInstancesofComplaintX "

Что лучше здесь обрабатывать нулевые значения? Например,

For row-i:
    when "students" == null:
       set newly derived column compaintSeverityOfComplaintX = empty Map
       set newly derived column compaintNumInstancesofComplaintX = empty Map
    else
       run above SQL to set proper values for newly derived columns compaintSeverityOfComplaintX and compaintNumInstancesofComplaintX

Обновление: я попытался добавить фиктивный studentInfo, но он выдает ошибку


withColumn("students", when($"students".isNull, typedLit(Seq.empty[Any])).otherwise($"students"))

Ошибка: java .lang.RuntimeException: неподдерживаемый класс буквенного типа scala .collection. неизменяемый.Nil $ List ()

1 Ответ

1 голос
/ 03 августа 2020

Предположим, например, что вы знаете тип нового производного столбца, которым в вашем случае является Map [K, V].

Вы можете попробовать что-то вроде этого

val derivedColumn = joinMap(col("severityOfComplaintXMapList"))

dataframe.withColumn("compaintSeverityOfComplaintX", when(col("students").isNull, typeLit[Map[String, Int]](Map.empty[String, Int]))).otherwise(derivedColumn)
...