【问题标题】:Presto - how to perform correlations on between all columns in one queryPresto - 如何在一个查询中的所有列之间执行相关性
【发布时间】:2020-04-01 22:30:53
【问题描述】:

我有一个格式如下的表格:

A   B   C   D 
7   7   2   12
2   2   3   4
2   2   2   4
2   2   2   3
5   5   2   7

我想使用内置相关函数 (https://prestodb.io/docs/current/functions/aggregate.html corr(y, x) → double) 计算每列之间的相关性

我可以遍历所有列并每次执行 corr 计算: select corr(A,B) from table 但我想减少访问 presto 的次数,并尽可能在一个查询中运行它。

是否有可能获得超过某个阈值的列名,或者至少是一个查询中所有可能组合之间的相关分数?

谢谢。

【问题讨论】:

  • 相关性涉及两个系列的数据(这里是两列)。您将如何定义每列之间的相关性
  • 也许我应该澄清一下,我想在一个查询中获取所有列组合之间的相关矩阵(A 与 B、A 与 C、A 与 D、B 与 C 等)

标签: sql hive presto amazon-athena


【解决方案1】:

我想计算每一列之间的相关性

相关性涉及两个系列的数据(在 SQL 中,两列)。因此,我将您的问题理解为:如何计算表中每个可能的列组合的相关性。看起来像:

select
    corr(a, b) corr_a_b,
    corr(a, c) corr_a_c,
    corr(a, d) corr_a_d,
    corr(b, c) corr_b_c,
    corr(b, d) corr_c_d,
    corr(c, d) corr_c_d
from mytable

【讨论】:

  • 这是一个可能的解决方案,但对于 100-200 列的表来说是不可用的。
  • @Andreyn:您所描述的内容无法在纯 SQL 中实现。为此,您需要动态 SQL(即动态构造查询字符串,然后执行它)。
【解决方案2】:

您可以使用横向联接来取消透视表,然后使用自联接和聚合:

with v as (
      select v.*, t.id
      from (select t.*,
                   row_number() over (order by a) as id
            from t
           ) t cross join lateral
           (values ('a', a), ('b', b), ('c', c), ('d', d)
           ) v(col, val)
     )
select v1.col, v2.col, corr(v1.val, v2.val)
from v v1 join
     v v2
     on v1.id = v2.id and v1.which < v2.which
group by v1.col, v2.col;

row_number()只是为每一行生成一个唯一的id,然后用于自连接。您可能已经有一个包含此信息的列,因此可能没有必要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-15
    • 2015-05-10
    • 2017-06-08
    • 2018-05-31
    • 2023-03-15
    • 1970-01-01
    • 2017-05-02
    • 2023-03-27
    相关资源
    最近更新 更多