【问题标题】: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()
      

      【讨论】:

        猜你喜欢
        • 2017-02-28
        • 2014-04-21
        • 1970-01-01
        • 2021-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-18
        • 2018-01-31
        相关资源
        最近更新 更多