sql - 如何处理多个重叠的数据集?

标签 sql hadoop hive

我有一组结构如下的数据:

[user_id, title, country, platform, language]
[100, 'Title A', 'US', 'Windows', 'English']
[100, 'Title A', 'US', 'Android', 'English']
[200, 'Title C', 'FR', 'Windows', 'French']
[300, 'Title B', 'US', 'Windows', 'English']
And so on...

我需要转换此数据,以便计算每个类别中的唯一用户数。

如果我要编写查询:

SELECT
title
, country
, platform
, language
count(distinct user_id)
FROM table
GROUP BY 1
, 2
, 3
, 4

生成的表格如下所示:

[title, country, platform, language, unique_count]
['Title A', 'US', 'Windows', 'English', 10,000]
['Title A', 'US', 'Android', 'English', 7,000]
['Title C', 'FR', 'Windows', 'France', 4,000]
['Title B', 'US', 'Windows', 'English', 8,000]
And so on...

如果我要隔离各个维度,那么会出现重叠,因为用户可能属于多个类别。

我如何以行包含在内的方式构建数据,并且可以在仪表板中制成表格?

如果只有两个类别,这似乎是一个更简单的问题,因为数据可以格式化为立方体:

        | Windows | Android |
--------+---------+---------+----
Title A | 10,000  |  7,000  | 17,000
--------+---------+---------+----
Title B |  8,000  |  11,000 | 19,000
--------+---------+---------+----
        | 19,000  | 18,000  |

是否存在可以包含所有维度的 n 维结构?

另一个问题是数据必须聚合并且不能简单地旋转,因为它太大而无法放入内存。

最佳答案

如果你想要所有的组合,那么使用with cube:

SELECT title, country, platform, language,
       count(unique user_id)
FROM table
GROUP BY title, country, platform, language with cube;

更常见的是,我更喜欢GROUPING SETS。例如,获取所有对:

SELECT title, country, platform, language,
       count(unique user_id)
FROM table
GROUP BY ( (title, country),
           (title, platform),
           (title, language),
           (country, platform),
           (country, language),
           (platform, language)
         );

关于sql - 如何处理多个重叠的数据集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55541019/

相关文章:

php - 链接sql中的两个表以获取动态数据

java - Apache Spark-Kafka.TaskCompletionListenerException & KafkaRDD$KafkaRDDIterator.close 本地集群上的 NPE(客户端模式)

oracle - Sqoop 作业因 Oracle 导入的 KiteSDK 验证错误而失败

java - Hive NVL 不适用于列的日期类型 - NullpointerException

python - 使用 impyla 执行时如何在配置单元查询中传递参数?

sql - 在 Oracle SQL 中处理循环数据

mysql - 从保存在另一列中的列中选择

sql - 如何将 SQL 查询转换为 Odata 查询

java - 使用 HBase MapReduce 将文件名作为行键插入

apache-spark - 是否可以通过spark 2.4使用Hadoop 3.x和Hive 3.x?