首页 > 解决方案 > 根据数组列中的元素过滤数据帧

问题描述

我正在使用数据框

       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))也没有工作。

请问有什么帮助吗?

标签: scalaapache-sparkdataframeapache-spark-sql

解决方案


直接的方法是使用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应该是你想要的输出


推荐阅读