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

How to compare a column against every other column in a SQL query with a wide table?

我正在尝试在 AWS Athena 中实现一个查询,我在其中计算选定列与矩阵中所有其他列的 Pearson 相关系数,以及 return 排序列表。

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

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

我希望能够计算 corr(col_1, col_2), corr(col_1, col_3), ...cor(col_1, col_15000) 并按相关系数对结果进行排序(找到 most/least 相关列)。

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

SELECT
corr(col_1, col_2) AS cor_2,
corr(col_1, col_3) AS cor_3,
...

corr(col_1, col_15000) AS cor_15000

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

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

这听起来更像是 Spark Job which could be run in AWS Glue via an ETL Job 的工作。

由于您的数据已经在 Athena 中,它应该已经在 Glue 中编目,您可以在 spark 中使用 GlueContext 直接从该数据源加载数据框。

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

假设您不熟悉其中的大部分内容,了解一下这个 example/tutorial 可能会很好: https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-python-samples-legislators.html