查询hive表不成功

Posted

技术标签:

【中文标题】查询hive表不成功【英文标题】:Unsuccessful in querying hive table 【发布时间】:2020-09-09 16:51:01 【问题描述】:

所以我开始学习如何使用 hive,但在查询我从 https://github.com/CSSEGISandData/COVID-19/tree/master/csse_covid_19_data/csse_covid_19_daily_reports 的数据集创建的表时遇到了麻烦

从我尝试查找的 5 个最近的 .csv 文件制作表格后: 1) 恢复最多的 10 个不同国家 2) 每个国家恢复最多的日期和 3) 是否有任何国家的恢复比活跃病例多。

我尝试了几种不同的方法,但我得到的最好的方法是 10 个列表,其中包含 3 或 4 个重复的国家/地区。

所以与其拥有类似的东西 英国, 英国, 英国, 英国, 巴西, 俄罗斯, ...

我想要英国、巴西、俄罗斯、美国...

我尝试过 order by、group by、distinct,但我不断收到错误/没有得到想要的结果。不确定它是否有所作为,但我一直在使用 Hadoop 创建一个包含如下查询的 .sql 文件。然后我会用 hive -f 运行它。

SELECT COUNTRY FROM COVID_19 ORDER BY COVID_19.CONFIRMED DESC LIMIT 10;

编辑 - 表是这样创建的:

CREATE EXTERNAL TABLE COVID_19(
`FIPS` bigint,
`admin2` string,
`province` string,
`country` string,
`last_update` string,
`lat` double,
`long_` double,
`confirmed` bigint,
`deaths` bigint,
`recovered` bigint,
`active` bigint,
`combined_key` string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
*s3 bucket containing the csv files*

如前所述,链接中的数据用于制作表格。 5 个最新的 csv 文件。

【问题讨论】:

您好,摩根,如果您可以提供带有示例数据的表架构,这将有助于创建查询。目前尚不清楚您在数据集中的表格中使用了哪些字段。 【参考方案1】:

至于问题 1),您似乎在寻找聚合。这为您提供了总数排名前 10 的国家/地区confirmed

select country, sum(confirmed) total_confirmed
from covid_19 
group by country 
order by total_confirmed desc
limit 10

请注意,在 SO 上一次发布多个问题并不是一个好习惯。但是,这是问题 2) 的一种方法。想法是使用相关子查询过滤数据集:

select c.*
from covid_19 c
where c.recovered = (select max(recovered) from covid_19 c1 where c1.country = c.country)

以上假设confirmedrecovered 给出每日病例数。另一方面,如果它们代表始终递增的值,那么方法会有所不同。

对于问题1,我们需要使用max()而不是sum()

select country, max(confirmed) max_confirmed
from covid_19 
group by country
order by max_confirmed desc
limit 10

对于问题 2,它有点复杂。基本上,我们需要lag() 来获取前一天的值。然后我们可以使用row_number()rank()按照回收率的差异对记录进行排序,并根据每个国家/地区的最高记录进行过滤:

select *
from (
    select 
        c.*,
        rank() over(partition by country order by recovered - lag_recovered desc) rn
    from (
        select 
            c.*, 
            lag(recovered) over(partition by country order by last_update) lag_recovered
        from covid_19 c
    ) c
) c
where rn = 1

【讨论】:

这些都不起作用。问题 1 的答案给了我错误 Expression not in GROUP BY key 'country'(错误 10025),而问题 2 的答案只列出了完整的表格。如果有帮助,我正在使用 Hive 2.3.2 @Mogan_Clarke:我忘记了group by 子句-这是初学者的错误,我不知道当时我的想法在哪里!固定。【参考方案2】:

所以我设法找到了我想要的结果,谢谢 GMB 提醒我 MAX 是一个东西!

第一季度)

SELECT COUNTRY, MAX(CONFIRMED) AS MAX_CASES
FROM COVID_19
GROUP BY COUNTRY
SORT BY MAX_CASES DESC
LIMIT 10;

第二季度)

SELECT COUNTRY, LAST_UPDATE, MAX(CONFIRMED) AS MAX_DATES
FROM COVID_19
GROUP BY COUNTRY, LAST_UPDATE
SORT BY MAX_DATES DESC
LIMIT 10;

我想我已经把这个复杂化了……

【讨论】:

以上是关于查询hive表不成功的主要内容,如果未能解决你的问题,请参考以下文章

在SQL*Plus里面已经显示创建表成功了,可是后面为啥又说表不存在呢?

从 Beeline 连接时,Hive 查询在 Tez 上失败,但在 Map-Reduce 上成功

HIVE 创建表不为空

BigQuery - 集群表不使用多个键减少查询大小

使用 sqitch 中的 mysql 查询验证表不存在

Hibernate创建表不成功,sql语法错误