【问题标题】:spark count and filtered count in same query同一查询中的火花计数和过滤计数
【发布时间】:2017-02-02 13:34:43
【问题描述】:

在 SQL 中类似于

SELECT  count(id), sum(if(column1 = 1, 1, 0)) from groupedTable

可以制定为一次性计算总记录数和过滤记录数。

如何在 spark-data-frame API 中执行此操作?即无需将其中一个计数加入原始数据帧。

【问题讨论】:

  • 您是否尝试使用 CASE ... WHEN 运行此查询?
  • 您可以使用registerTempTable 将数据帧注册为临时表,并按照@T.Gawęda 的建议在sql 查询中使用CASE ... WHEN 语句。
  • 我知道应该可以。但是是否有可能留在更安全的 scala-spark-dataframe api 中?
  • @GeorgHeiler 您可以使用类型化 API:spark.apache.org/docs/latest/api/scala/…

标签: sql apache-spark count apache-spark-sql


【解决方案1】:

两种情况都使用count

df.select(count($"id"), count(when($"column1" === 1, true)))

如果列是 nullable,则应进行更正(例如使用 coalesceIS NULL,具体取决于所需的输出)。

【讨论】:

    【解决方案2】:

    您可以尝试将 spark 与 hive 一起使用,因为 hive 支持 SQL 的 sum if() 功能

    首先,您需要使用以下代码在数据之上创建配置单元表

    val conf = new SparkConf().setAppName("Hive_Test")
    val sc = new SparkContext(conf)
    //Creation of hive context      
    val hsc = new HiveContext(sc)
    
    import spark.implicits._
    import spark.sql
    
    hsc.sql("CREATE TABLE IF NOT EXISTS emp (id INT, name STRING)")
    
    hsc.sql("LOAD DATA LOCAL INPATH 'examples/src/main/resources/test.txt' INTO TABLE emp")
    
    
    hsc.sql("""select count(id), SUM(v)
    from (
    select id, IF(name=1, count(*), 0) AS v
    from emp
    where id>0
    group by id,name
    ) t2""")
    

    【讨论】:

      猜你喜欢
      • 2020-08-09
      • 2012-08-22
      • 1970-01-01
      • 1970-01-01
      • 2021-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多