Фильтрация dataFrame по элементу из столбца массива - PullRequest
0 голосов
/ 27 августа 2018

Я работаю с фреймом данных

       root
          |-- c: long (nullable = true)
          |-- data: array (nullable = true)
          |    |-- element: struct (containsNull = true)
                  |    |    |-- key: string (nullable = true)
                  |    |    |-- value: string (nullable = true)

Я пытаюсь отфильтровать этот фрейм данных на основе элемента ["value1", "key1"] в массиве данных, т.е. если этот элемент существует в данных df, так что оставьте его, иначе удалите его, я попытался

df.filter(col("data").contain("["value1", "key1"])

но это не сработало. Также я пытался поставь val f=Array("value1", "key1") потом df.filter(col("data").contain(f)) тоже не сработало.

Любая помощь, пожалуйста?

1 Ответ

0 голосов
/ 27 августа 2018

Прямой подход заключается в использовании функции udf, так как udf функция помогает выполнять логику построчно и в примитивных типах данных (вот что предлагает ваше требование проверить каждый ключ и значение struct элемент в столбце данных массива )

import org.apache.spark.sql.functions._

//udf to check for key1 in key and value1 in value of every struct in the array field
def containsUdf = udf((data: Seq[Row])=> data.exists(row => row.getAs[String]("key") == "key1" && row.getAs[String]("value") == "value1"))
//calling the udf function in the filter 
val filteredDF = df.filter(containsUdf(col("data")))

так что filteredDF должен быть вашим желаемым выводом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...