如何在具有宽表的SQL查询中将一列与其他所有列进行比较?

时间:2019-06-10 21:11:03

标签: sql correlation presto amazon-athena pearson-correlation

我正在尝试在AWS Athena中实现查询,在该查询中,我将所选列的相对于矩阵中其他所有列的Pearson相关系数计算出来,并返回一个排序列表。

数据作为CSV文件存储在S3中,如下所示:

E

我希望能够计算corr(col_1,col_2),corr(col_1,col_3),... cor(col_1,col_15000)并按相关系数对结果进行排序(查找相关度最高/最少的列) 。

编写此查询的最有效方法是什么?我希望此查询尽可能地高效。显而易见的答案是生成这样的查询:

col_1 col_2 col_3 col_4 .... col_15000
  0    124    56   200  ....   4
  0     0     44    0   ....   0
....

但是,这似乎很乏味,并且很快达到了查询大小限制。有没有更好的方法而不牺牲(或提高)性能?这可以很容易地并行化,因为每个独立的相关系数都可以独立计算。

1 个答案:

答案 0 :(得分:0)

我知道这不是您可能正在寻找的答案,但这似乎不应该通过Athena / SQL / Presto完成。需要数千个自定义列是一个很大的危险信号。

这听起来更像是Spark作业,可以通过AWS GlueETL Job中运行。

由于您的数据已经在Athena中,因此应该已经在Glue中对其进行了分类,因此您可以在Spark中使用GlueContext直接从该数据源加载数据帧。

Spark作业可以使用Python(通过pyspark)或Scala完成。通过代码循环创建这些系数列,然后将它们写到另一个文件中,应该不是很复杂的脚本。

假设您不熟悉其中的大部分内容,那么最好阅读以下示例/教程: https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-python-samples-legislators.html