Удаление пустых строк из фрейма данных Spark

#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