#scala #apache-spark #aws-glue
#scala #apache-spark #aws-склеивание
Вопрос:
Я считываю DF из S3. Вот как выглядит моя схема —
Файл 1 —
root
|-- patient: long (nullable = true)
|-- payment1: double (nullable = true)
Файл 2 —
root
|-- patient: long (nullable = true)
|-- payment2: double (nullable = true)
Я пытаюсь объединить поля оплаты, но не могу сделать это успешно. Мне нужно это сделать, потому что мне нужно добавить два поля оплаты, и оба они могут быть нулевыми или пустыми.
До сих пор я пробовал следующее —
df.na.fill
— Не работает, потому что у меня есть пустые строки.select(when(col("payment1") === "", 0.0).otherwise(col("payment1"))
Используя два вышеуказанных метода, когда я добавляю два столбца, я все равно получаю NULL, если одно значение равно NULL или пусто.
Комментарии:
1. где у вас есть «пустые строки»? Согласно вашей схеме, строк вообще нет
2. Может быть, с помощью
coalesce
функции?when(coalesce(col("payment1"), col("payment2")).isNull, 0.0)
Ответ №1:
Вы можете проверить наличие empty и null с помощью метода when, заменить его на lit(0) и преобразовать его в double (если тип данных столбца отличается от double, в противном случае приведение не требуется).
file1Df.withColumn("payment1",
when(col("payment1") === "" or col("payment1").isNull,lit(0))
.otherwise(col("payment1")).cast(DoubleType))
Комментарии:
1. Пожалуйста, не публикуйте только код в качестве ответа, но также предоставьте объяснение, что делает ваш код и как он решает проблему вопроса. Ответы с объяснением обычно более полезны и более высокого качества и с большей вероятностью привлекут голоса.