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

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

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

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

输出

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

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

  1. SELECT a.id, a.first_name, a.last_name, a.date, b.id FROM
  2. (SELECT first_name, last_name,dob,count(*) FROM table group by first_name, last_name,dob having count(*) in
  3. (SELECT max(total) AS freq FROM
  4. (SELECT first_name, last_name, dob, count(*) AS total FROM table group by first_name, last_name, dob)
  5. AS test_temp group by first_name, last_name)
  6. ) 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 学生:

  1. select t.id, t.first_name, t.last_name,
  2. first_value(dob) over (partition by first_name, last_name
  3. order by dob_cnt desc, date desc
  4. rows between unbounded preceding and current row
  5. ) as dob_imputed
  6. from (select t.*,
  7. count(*) over (partition by first_name, last_name, dob) as dob_cnt
  8. from t
  9. ) t

相关问题