将过滤器作为参数传递给 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
其中filter1
、filter2
、filter3
、AND
和OR
条件是从配置中获取的
谢谢
【问题讨论】:
【参考方案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 函数的主要内容,如果未能解决你的问题,请参考以下文章
如何将三个或多个参数传递给自定义模板标签过滤器 django?