【问题标题】:Comparing Current Row Value to All previous Row Value in HIVE SQL or TABLEAU将当前行值与 HIVE SQL 或 TABLEAU 中的所有先前行值进行比较
【发布时间】:2019-12-31 08:02:48
【问题描述】:

我想将当前行值与 Tableau 或 SQL 中的所有先前值进行比较。下面是我想要的一个例子。

就像 colA Row2 一样,如果它大于,我想将它与 Row1 进行比较。对于 colA Row 2,我想将其与 Row2 和 Row3 进行比较。这将持续下去,直到它到达分区的末尾。然后输出只是计算有多少场景为真(如表格右侧所示)。

有人知道如何在 Tableau 或 Hive SQL 中执行此操作的任何语法吗?我已经探索了 HIVE sql 中的 LAG() 函数以及 Tableau 中的 WINDOW_SUM() 函数。

我可以选择在 Hive 中创建 UDF,但我不太熟悉这个概念和语法。

感谢您的帮助。

【问题讨论】:

    标签: sql hive tableau-api


    【解决方案1】:

    当数据值的顺序影响计算时,作为 Tableau 客户端,您有两种选择。

    1. 使用自定义 SQL 编写依赖于行顺序的查询,例如支持窗口查询的更高版本的 SQL,使用 over 和 partition 关键字。这种方法在数据库服务器上执行特定于订单的计算。
    2. 使用 Tableau 表计算来编写遍历(聚合)查询结果的计算,以计算所需的值。表计算是 Tableau 中唯一一种(至少 4 种)计算类型,可以比较不同行之间的值。其他类型的 Tableau 查询(记录级计算、聚合计算和 LOD 计算)非常有用,但无法根据不同行的顺序执行任何操作。

    这两种方法都很有用。两者都有怪癖和复杂性。在所有条件相同的情况下,表格计算更加灵活,所以我会先尝试这些。意识到除了公式之外,表计算还由有关如何遍历查询结果集的信息指定 - 称为分区和寻址。请参阅表格计算的在线帮助。

    但是,由于表格计算是在客户端实现的,因此当您拥有非常大的数据集而无需将其提取到客户端时,它们就不是最佳选择。当驱动计算的信息已经在客户端获取时,例如聚合查询结果,它们是一个不错的选择。

    【讨论】:

      【解决方案2】:

      试试这个:

      gs_test 是您的输入表,其中包含 cola

      select 
          cola, 
          row_num, 
          sum(if(cola>next_el_, 1, 0)) as countOfTrueBefore 
      from 
          (
          select 
              cola, 
              row_num, 
              collect_set(cola) over (order by row_num asc rows between 1 following and unbounded following) as next_el 
          from 
              (
              select 
                  cola, 
                  sum(1) over (rows between unbounded preceding and current row) as row_num 
              from 
                  gs_test
              ) main_inner
          ) main 
      lateral view outer explode(next_el) ne as next_el_ group by cola, row_num;
      

      结果

      可乐 - 原创专栏

      row_num - 逆行号(第一行是最后一行)

      countOfTrueBefore - 根据您的逻辑

      MapReduce Jobs Launched:
      Stage-Stage-1: Map: 1  Reduce: 1   Cumulative CPU: 6.91 sec   HDFS Read: 7690 HDFS Write: 278 SUCCESS
      Stage-Stage-2: Map: 1  Reduce: 1   Cumulative CPU: 7.2 sec   HDFS Read: 8314 HDFS Write: 285 SUCCESS
      Stage-Stage-3: Map: 1  Reduce: 1   Cumulative CPU: 5.34 sec   HDFS Read: 5586 HDFS Write: 63 SUCCESS
      Total MapReduce CPU Time Spent: 19 seconds 450 msec
      OK
      0.01    5       0
      0.33    1       1
      0.47    6       0
      0.48    2       2
      0.75    4       2
      0.85    7       0
      0.88    3       4
      
      

      【讨论】:

        【解决方案3】:

        为了让您的问题有意义,您需要一个指定顺序的列。我将假设第一列是带有此信息的 id 列。

        这在一般 SQL 中具有挑战性。应该在 Hive 中工作的一种方法是交叉连接和聚合。

        select t.id, t.colA,
               sum(case when t2.id < t.id and t2.colA < t.colA then 1 else 0 end)
        from t cross join
             t t2
        group by t.id, t.colA;
        

        注意:即使在中等大小的桌子上,这也不会有很好的性能。

        【讨论】:

          猜你喜欢
          • 2022-08-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-13
          • 1970-01-01
          相关资源
          最近更新 更多