Я пытаюсь инициализировать список в Spark, используя scala, из столбца данных. Значение в некоторых строках может быть пустым, а в некоторых строках оно заполнено. Итак, я делаю свой список типа Option[String]
. Но когда я обращаюсь к элементам в нем, scala возвращает Some
для каждого элемента, включая пустые значения, даже если они были инициализированы с использованием Option(null)
. Это означает, что когда я пытаюсь получить значение как getOrElse("0")
, он печатает Some()
, если значение должно было быть «0». В коде это то, что я делаю:
val columnsToRead: List[String] = List("__id", "device");
val selectedColumnsDataset: Array[List[(String, Option[String])]] =
dataset.map(s => {columnsToUseForCorrelation
.map(t => (t, Option(s.getAs[String](t))))
}).collect();
Я подтвердил, что выражение s.getAs[String](t)
возвращает ноль, если t
не находится в строке, написав эту альтернативную карту
val selectedColumnsDataset2: Array[List[(String, Option[String])]] =
dataset.map(s => {columnsToUseForCorrelation
.map(t => (t, s.getAs[String](t)))
.map(t => (t._1, if (t._2 == null) Option(null) else Option(t._2)))
}).collect();
Оба эти выражения возвращают один и тот же вывод, поэтому я думаю, что я делаю это правильно. Проблема, с которой я сталкиваюсь, это когда я пытаюсь распечатать значения здесь. Сначала я должен преобразовать list
в wrappedarray
, что мне не понятно, где происходит неявное преобразование, но выдает исключение, если я делаю карту в списках. Это мой код для распечатки этих значений:
val selectedColumnsParsed = selectedColumnsDataset.asInstanceOf[Array[mutable.WrappedArray.ofRef[(String, Option[String])]]];
selectedColumnsParsed.foreach(s => {
s.foreach(t => {
println(t._2.getOrElse("0"), t._2)
})
})
Вывод, который я получаю от них,
(440,Some(440))
(157,Some(157))
(441,Some(441))
(,Some())
(,Some())
(443,Some(443))
(,Some())
Пустые значения показывают, что они пусты, поэтому они должны были быть автоматически преобразованы в тип None
, но вместо этого они имеют тип Some
, и я не понимаю, как они не Some(null)
как они должны быть. Строки выглядят так, как будто они пустые длины 0, но вызов isEmpty
в операторах println выдает исключение нулевого указателя, что означает, что getOrElse
должен возвращать значение по умолчанию 0
, но это не делает. Как правильно инициализировать тип Option
, чтобы null
соответствовал типу None
?