#scala #apache-spark #sbt
#scala #apache-spark #sbt
Вопрос:
Попытка удалить строки, в которых столбец фрейма данных Spark содержит пустые строки. Изначально так val df2 = df1.na.drop()
и было, но оказалось, что многие из этих значений кодируются как ""
.
Я застрял с использованием Spark 1.3.1, а также не могу полагаться на DSL. (Импорт spark.implicit_ не работает.)
Комментарии:
1. что вы хотите сделать с пустыми строками? отбросить строку?
Ответ №1:
Для удаления объектов из фрейма данных требуется filter()
.
newDF = oldDF.filter("colName != ''")
или я неправильно понимаю ваш вопрос?
Комментарии:
1. Как я могу написать это, используя предложение Where
2.
WHERE colName IS NOT NULL
илиWHERE colName IS NOT EMPTY
… я думаю.3. Или, с фреймами данных / наборами данных, .
oldDF.filter($"colName" =!= "")
Не забудьтеimport org.apache.spark.sql.functions._ import org.apache.spark.sql.types._
4. Работает и для PySpark!
Ответ №2:
На случай, если кто-то не хочет удалять записи с пустыми строками, а просто преобразует пустые строки в некоторое постоянное значение.
val newdf = df.na.replace(df.columns,Map("" -> "0")) // to convert blank strings to zero
newdf.show()
Ответ №3:
Вы можете использовать это:
df.filter(!($"col_name"===""))
Он отфильтровывает столбцы, в которых значение «col_name» равно «», т.е. ничего / пустая строка. Я использую фильтр соответствия, а затем инвертирую его на «!»
Комментарии:
1. Хотя этот код может решить проблему, включение объяснения того, как и почему это решает проблему, действительно помогло бы улучшить качество вашего сообщения и, вероятно, привело бы к большему количеству голосов. Помните, что вы отвечаете на вопрос для будущих читателей, а не только для того, кто задает его сейчас. Пожалуйста, отредактируйте свой ответ, чтобы добавить пояснения и указать, какие ограничения и предположения применяются.
2. Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и / или почему он решает проблему, улучшит долгосрочную ценность ответа.
Ответ №4:
Я также новичок в spark, поэтому я не знаю, является ли приведенный ниже код более сложным или нет, но он работает.
Здесь мы создаем udf, который преобразует пустые значения в null.
sqlContext.udf().register("convertToNull",(String abc) -> (abc.trim().length() > 0 ? abc : null),DataTypes.StringType);
После приведенного выше кода вы можете использовать «convertToNull» (работает со строкой) в предложении select и сделать все поля пустыми, а затем использовать .na().drop() .
crimeDataFrame.selectExpr("C0","convertToNull(C1)","C2","C3").na().drop()
Примечание: вы можете использовать тот же подход в scala.
https://jaceklaskowski.gitbooks.io/mastering-apache-spark/content/spark-sql-udfs.html