当前位置: 首页 > 面试题库 >

对行进行排序时优化Hive GROUP BY

车明贤
2023-03-14
问题内容

我有以下(非常简单)Hive查询:

select user_id, event_id, min(time) as start, max(time) as end,
       count(*) as total, count(interaction == 1) as clicks
from events_all
group by user_id, event_id;

该表具有以下结构:

user_id                 event_id                time            interaction 
Ex833Lli36nxTvGTA1Dv    juCUv6EnkVundBHSBzQevw  1430481530295   0
Ex833Lli36nxTvGTA1Dv    juCUv6EnkVundBHSBzQevw  1430481530295   1
n0w4uQhOuXymj5jLaCMQ    G+Oj6J9Q1nI1tuosq2ZM/g  1430512179696   0
n0w4uQhOuXymj5jLaCMQ    G+Oj6J9Q1nI1tuosq2ZM/g  1430512217124   0
n0w4uQhOuXymj5jLaCMQ    mqf38Xd6CAQtuvuKc5NlWQ  1430512179696   1

对于一个事实,我知道行首先按user_id,然后按排序event_id

问题是:鉴于行已排序,有没有一种方法可以“提示” Hive引擎来优化查询?优化的目的是避免将所有组都保留在内存中,因为这一次仅需保留一个组即可。

现在,此查询在具有大约300 GB数据的6节点16 GB
Hadoop集群中运行,大约需要30分钟,并且使用了大部分RAM,这使系统感到窒息。我知道每个组(user_id, event_id)都很小,每个元组不超过100行,因此我认为优化的执行可能会占用很小的内存,而且速度也会更快(因为不需要循环组键)。


问题答案:

创建一个存储桶的排序表。优化器将知道它是根据元数据排序的。在此处查看示例(官方文档):https :
//cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-
BucketedSortedTables

仅计数互动= 1: count(case when interaction=1 then 1 end) as clicks-大小写会将所有行标记为1或为null,并且仅计数1s。



 类似资料:
  • 场景:匹配算法已识别ID1,ID2已匹配。我需要对匹配做进一步的分析。为此,我需要减少输出中的行数并正确排序。 这个输入只是样本和子集。拥有数千条实际记录使这项任务变得困难。 输入: 预期产出: 我需要确保输出应该有ID,应该有ID1和ID2组合的不同记录,这仍然很好,因为我可以进行distinct和union。 棘手的部分是确保输出中的数据排序。我需要将相似的行按顺序排列。 示例: 111,22

  • 我试图排序列的. csv文件。这些是列的名称和顺序: 这是我想要的订单: 当前我的代码如下所示: 使用我当前的代码,我得到以下列顺序的结果: 所以我已经想出了我必须传递一个函数给排序函数来指定我希望它如何排序,但是我找不到一个函数来做这件事。 非常感谢您的任何意见!

  • 问题内容: 我有四个表头: 我希望能够通过单击标题对表格进行排序。 所以如果我的桌子是这样的 然后我点击 我的桌子现在看起来像这样: 也就是说,每列的内容永远不会改变,但是通过单击我要对列进行排序的标题,行将自行重新排序。 我的表的内容是通过Mojolicious完成的数据库调用创建的,并通过以下方式返回到浏览器: 我拼凑的其余代码看起来像这样: 从现在开始,如何通过单击表顶部的标题来对列进行排序

  • 问题内容: 我有一个JTable,其属性AutoCreateRowSorter设置为true。单击时效果很好,但如果单击时仅将鼠标移动1px,则不会出现排序,这在某些情况下不舒服。如何解决这个问题? UPD我只想在释放鼠标时显示排序。 问题答案: 肮脏的方法(请阅读: 如果您不是绝对地绝望,请确切地知道自己在做什么!请不要这样做 ),方法是挂接到uiDelegate安装的MouseListener

  • 问题内容: 简而言之:有什么方法可以对GROUP_CONCAT语句中的值进行排序吗? 查询: 我得到这一行: 工艺品»细木工 行政管理»组织 我想要这样: 行政管理»组织 工艺品»细木工 问题答案: 当然,请参见http://dev.mysql.com/doc/refman/...tions.html#function_group- concat :

  • 问题内容: 我有这样的价值观: 我想按升序对每个值进行排序。我不想在集合之间进行排序,而是在每个集合中进行排序。 问题答案: 来自评论: 我想对每个集合进行排序。 这很容易。对于任何集合(或其他任何可迭代的对象),以排序顺序返回的元素列表: 请注意,这是给您一个,而不是一个。这是因为在数学和几乎每种编程语言中,集合的全部要点*都是无序的:集合和是同一集合。 您可能真的不想将这些元素排序为字符串,而