将过滤器作为参数传递给 Dataframe.filter 函数

Posted

技术标签:

【中文标题】将过滤器作为参数传递给 Dataframe.filter 函数【英文标题】:Pass filters as parameter to Dataframe.filter function 【发布时间】:2018-10-15 07:07:26 【问题描述】:

我有一个数据框 userdf

val userdf = sparkSession.read.json(sparkContext.parallelize(Array("""["id" : 1,"name" : "user1","id" : 2,"name" : "user2"]""")))

scala> userdf.show
+---+-----+
| id| name|
+---+-----+
|  1|user1|
|  2|user2|
+---+-----+

我想用id === 1 检索用户,我可以使用类似

的代码来实现
scala> userdf.filter($"id"===1).show
+---+-----+
| id| name|
+---+-----+
|  1|user1|
+---+-----+

我想要达到的效果是这样的

val filter1 = $"id"===1
userdf.filter(filter1).show

这些过滤器是从配置文件中获取的,我正在尝试使用这个构建块来实现更复杂的查询,比如

userdf.filter(filter1 OR filter2).filter(filter3).show 

其中filter1filter2filter3ANDOR 条件是从配置中获取的

谢谢

【问题讨论】:

【参考方案1】:

filter 方法也可以接受一个字符串,它是一个 sql 表达式。 这段代码应该产生相同的结果

userdf.filter("id = 1").show

所以你可以从配置中获取该字符串

【讨论】:

此解决方案不适用于多个“and”和“or”条件。即, userdf.filter($"name"==="user1" || $"id" === 1) 工作正常,但 userdf.filter("id=2" || "id=1") 不是在职的。 ***.com/questions/35881152/… 只要是有效的 sql 语句就应该可以工作:userdf.filter("id=2 or id=1") 谢谢。 “只要是有效的 sql 语句”这句话很有帮助。 @user811602 解决这个问题好运吗? @JellfLL 我已经创建了 lev 评论的有效 sql 字符串语句。

以上是关于将过滤器作为参数传递给 Dataframe.filter 函数的主要内容,如果未能解决你的问题,请参考以下文章

将表达式参数作为参数传递给另一个表达式

将参数传递给 jq 过滤器

如何将三个或多个参数传递给自定义模板标签过滤器 django?

如何将参数传递给过滤器方法并使用不同的参数在 React onClick 事件中调用函数?

Django将多个参数传递给If语句中的自定义模板过滤器

如何迭代地将参数传递给 R 函数