如何在where条件下传递列值

piok6c0g  于 2021-07-13  发布在  Spark
关注(0)|答案(2)|浏览(362)

我无法在spark中实现简单的sql查询。
我想用scala spark编写以下查询:

select * from emp where emp_id in (select distinct manager_id from emp ;

下面是我尝试的:

empdf.where(col("emp_id").isin(empdf.select("manager_id").collect().map(_(0)).toList)).show()

我得到以下错误:
java.lang.runtimeexception:不支持的文本类型类scala.collection.immutable.$colon$colon list(null、68319、68319、68319、65646、65646、69062、66928、66928、66928、67858、66928、67832)

k97glaaz

k97glaaz1#

最好执行半联接以避免收集为列表:

empdf.alias("t1").join(empdf.alias("t2"), expr("t1.emp_id = t2.manager_id"), "left_semi")

如果你想用 isin ,可以使用 : _* (见此帖):

empdf.where(col("emp_id").isin(empdf.select("manager_id").collect().map(_(0)).toList: _*)).show()

或使用 isInCollection :

empdf.where(col("emp_id").isInCollection(empdf.select("manager_id").collect().map(_(0)).toList)).show()
osh3o9ms

osh3o9ms2#

你也可以用sql写,
empdf.createorreplaceview(“emp”)
sql(“select*from emp where emp\u id in(select distinct manager\u id from emp”)

相关问题