scala - 根据数组列中的元素过滤数据帧
问题描述
我正在使用数据框
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))
也没有工作。
请问有什么帮助吗?
解决方案
直接的方法是使用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
应该是你想要的输出
推荐阅读
- amazon-web-services - 如何在没有托管 UI 的情况下使用 aws-amplify API 使用联合身份验证?
- ios - 如何在 firestore 数据库中使用 swift 更新数组中的对象(地图)?
- javascript - 是否可以将元素包裹在头部
- api - 如何在您的烧瓶网站中显示 Stackoverflow 问题
- javascript - 如何按国际象棋顺序将两个数组合并为一个
- sql-server - 将 SQL Server 数据库从一台服务器复制到另一台服务器时出错
- ios - 如何为 ImagePicker 制作圆形编辑区域而不是矩形?
- ios - 如何将当前登录用户的数据保存到 Firebase?
- sql - 如何查看列是否有值
- openmp - 将 OpenMP 编译为 WebAssembly