【问题标题】:How to pass column values in where condition如何在where条件下传递列值
【发布时间】:2021-05-25 17:44:21
【问题描述】:
我无法在 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, 66928, 67858, 66928 , 67832)
【问题讨论】:
标签:
scala
dataframe
apache-spark
apache-spark-sql
【解决方案1】:
你也可以写成SQL,
empdf.createorreplaceview("emp")
spark.sql("select * from emp where emp_id in (select distinct manager_id from emp")
【解决方案2】:
最好进行半连接以避免收集为列表:
empdf.alias("t1").join(empdf.alias("t2"), expr("t1.emp_id = t2.manager_id"), "left_semi")
如果你想使用isin,你可以使用: _*展开列表(见this post):
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()