首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在spark sql中传递动态条件列表

如何在spark sql中传递动态条件列表
EN

Stack Overflow用户
提问于 2022-10-05 01:46:13
回答 1查看 72关注 0票数 0

我有一个用于星火sql查询的筛选条件列表,其形式为

代码语言:javascript
复制
Map<String, List<String>> conditions

假设初始数据集是

代码语言:javascript
复制
Dataset<Row> dataSet

我想使用地图中的每一个条目,比如(StringA,ListA),(StringB,ListB).以此类推,在过滤器中,每个条目将是一个或条件

代码语言:javascript
复制
(col("my_col1").equals("StringA").and(col("my_col2").isInCollection(ListA)))

OR

(col("my_col1").equals("StringB").and(col("my_col2").isInCollection(ListB)))

OR

(col("my_col1").equals("StringC").and(col("my_col2").isInCollection(ListC)))
....

dataset是一个具有(my_col1,my_col2)分区键的Cassandra表。

我预计地图上不会有超过5-6个条目

EN

回答 1

Stack Overflow用户

发布于 2022-10-05 02:01:57

使用isin

代码语言:javascript
复制
d.filter(col("value").isin(desiredThings: _*))

但是如果你真的想要foldLeft,你必须提供基本条件

代码语言:javascript
复制
d.filter(desiredThings.foldLeft(lit(false))(
(acc, x) => (acc || col("value") === (x)))
) 

或者,若要与筛选器一起使用或在何处使用,可以使用以下方法生成SQL表达式:

代码语言:javascript
复制
val filterExpr = desiredThings.map( v => s"value = $v").mkString(" or ")

然后把它当作

代码语言:javascript
复制
d.filter(filterExpr).show
// or
d.where(filterExpr).show

//+-----+
//|value|
//+-----+
//|    1|
//|    3|
//+-----+
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73955229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档