Hive - 选择条目数量

时间:2016-08-29 12:46:06

标签: hive

我在Hive工作。到目前为止它真的很棒,但我对查询有疑问。

我有两张名为'标记为'和'数据'并希望通过一个查询从两者中提取数据。

首先,我想从表中标出'标记'并计算表格中的条目数据'在心智之间(从标记为'获得)和当前日期之间。

因此,我希望得到一个结果,其中包含用户ID,另一个用户ID和当前日期之间另一个表的此用户ID的出现次数。 我试着从小时开始接收这个查询,但是因为我知道它们不能正常工作。有人可以帮帮我吗?

非常感谢!

更新

抱歉,我昨天有点匆忙。责备我,我忘记了一些细节。

关于架构:

  1. 标记的表格只有一些列。总共8.这是该表的架构:

    "name": "Datetime",
    "type": "long",
    "logicalType": "timestamp-millis",
    
    "name": "Hour",
    "type": "string",
    
    "name": "UserId64",
    "type": "long"
    
    "name": "MemberId",
    "type": "int"
    
    "name": "SegmentId",
    "type": "int"
    
    "name": "IsDailyUnique",
    "type": "boolean"
    
    "name": "IsMonthlyUnique",
    "type": "boolean"
    
    "name": "Value",
    "type": "int"
    
  2. 由于此表包含100多列,因此另一个称为数据的表的模式有点困难。为了简单起见,我只概述了重要的列:

    "name": "Datetime",
    "type": "long",
    "logicalType": "timestamp-millis",
    
    "name": "Hour",
    "type": "string",
    
    "name": "UserId64",
    "type": "long"
    
    "type": "enum",
    "name": "EventType",
    "symbols": ["IMP", "CLICK", "PC_CONV", "PV_CONV"]
    
  3. 因此,如果我执行如下查询,我会得到一个包含结果的列表

      

    选择时间戳(日期时间),小时,userid64,segmentid,isdailyunique,   ismonthlyunique,日期标记为userid64 = 8012570064195370898   和segmentid = 1878696由datetime desc命令;

    结果表包含数据。现在我想将最早获得的日期用于我的进一步查询。

    如果我们转到表数据并执行以下查询

      

    选择时间戳(日期时间),auctionid64,小时,事件类型,   mediacostdollarscpm,buyerpend,buyerbid,ecp,eap,isimp,isclick,   userid64,sellerid,publisherid,siteid,sitedomain,advertiserid,   advertiserfrequency,advertiserrecency,campaigngroupid,campaignid,   creativeid,creativefreq,creativerec,pixelid,dealid,dealtype,   custommodelid,custommodellastmodified,leafname,datetime from data   其中userid64 = 8012570064195370898和advertiserid = 327758订单   by datetime desc;

    您将得到如下所示的结果

    2016-08-09 19:33:45.0   5908114946988383281 17  PV_CONV
    2016-08-07 19:17:13.0   5908114946988383281 17  IMP
    2016-08-07 19:16:29.0   5454485145188351263 17  IMP
    2016-08-07 18:52:40.0   1074433759230515153 16  IMP
    2016-08-07 18:52:40.0   6991642005216308404 16  IMP
    2016-08-07 18:52:13.0   5024645171257244072 16  IMP
    2016-08-07 18:51:55.0   5371107932239703086 16  IMP
    2016-08-07 18:51:55.0   7321752276741166764 16  IMP
    2016-08-07 18:51:01.0   3459181835067844898 16  IMP
    2016-08-07 18:50:42.0   6208818658549255015 16  IMP
    2016-08-07 18:50:41.0   5373958128201701132 16  IMP
    2016-08-07 14:34:07.0   8393280749656213703 12  IMP
    

    此处的导入行是第二行。之后有一个名为" PV_CONV"。

    的标志

    我想要的是什么:

    我想要一个查询,它会生成一个包含

    的表格
    • 用户ID
    • 标记为
    • 的表格的最小日期
    • 包含event_type" IMP"
    • 的表格数据的最大日期
    • 表格数据的标记日期和最长日期之间的时差
    • 以及表数据的其他一些列。

    有没有机会在不创建额外表的情况下获得此功能? 一切顺利,谢谢 彼得

1 个答案:

答案 0 :(得分:0)

由于未提供表模式,我假设下面的表模式来回答您的问题..

表 - 标记:
UserID int, mindate date

表 - 数据:
UserID int, data_date date

将UserID视为加入表的主列,这是查询

SELECT D.UserID, M.mindate, count(D.data_date) from Marked M
join Data D on M.UserID = D.UserID 
where M.mindate <= D.data_date and D.data_date <= from_unixtime(unix_timestamp());

根据表中的'Date'数据类型,需要更改where子句。