hive-create数据集,用最常见的

uqdfh47h  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(409)

我需要创建一个数据集,该数据集包含与源表相同的行,但是用为此人找到的最常见的出生日期值替换出生日期。如果有平局,则应使用最近的日期。
输入

id  first_name  last_name  dob       date
---------------------------------------------
1   john        doe        06/11/85  01/01/17
2   john        doe        06/11/86  01/01/17
3   john        doe        06/11/86  01/01/17
4   jane        doh        01/06/87  01/01/17
5   jane        doh        01/01/80  01/02/17

输出

1 john doe 06/11/86 01/01/17
2 john doe 06/11/86 01/01/17
3 john doe 06/11/86 01/01/17
4 jane doh 01/01/80 01/01/17
5 jane doh 01/01/80 01/02/17

无名氏是更新06/11/86(最常见的)。jane doh更新至01/01/80(断开连接)。
我最近的尝试基于一个类似的例子:

SELECT a.id, a.first_name, a.last_name, a.date, b.id  FROM 
(SELECT first_name, last_name,dob,count(*) FROM table group by first_name, last_name,dob having count(*) in 
(SELECT max(total) AS freq FROM 
(SELECT first_name, last_name, dob, count(*) AS total FROM table group by first_name, last_name, dob) 
AS test_temp group by first_name, last_name)
) a   join (select * FROM table) b on (a.id = b.id)

我不仅想要一个解决方案,还想要一个我可以从中学习的解释。

r1wp621o

r1wp621o1#

SELECT a.id, a.first_name, a.last_name, b.dob, a.date FROM table a JOIN (SELECT DISTINCT id, first_name, last_name, dob, count(dob) AS cnt FROM table ORDER BY cnt DESC LIMIT 1) b ON (a.first_name=b.first_name) AND (a.last_name=b.last_name) 我想试试这个。为了得到最常见的dob,我用一个子select连接了基表。与 ORDER BY cnt DESC LIMIT 1 我让舒尔获得最常见的dob,以防遇到麻烦 max(count(dob)) 不是唯一的。然后我就把那个dob加入到每一张唱片里 firt_name 以及 last_name . 我希望这对你有帮助。

tv6aics1

tv6aics12#

你可以用 first_value() 函数指定出生日期,没有 JOIN 学生:

select t.id, t.first_name, t.last_name,
         first_value(dob) over (partition by first_name, last_name
                                order by dob_cnt desc, date desc
                                rows between unbounded preceding and current row
                               ) as dob_imputed
  from (select t.*,
               count(*) over (partition by first_name, last_name, dob) as dob_cnt
        from t
       ) t

相关问题