如何在 hive sql 中使用 group by 将数据转换为map?

ncgqoxb0  于 2021-04-07  发布在  Hive
关注(0)|答案(1)|浏览(913)

我有如下数据

|-----------|-------|-------|
|   grade   |lecture| count |
|-----------|-------|-------|
|  freshman | eng1  |   3   |
|-----------|-------|-------|
|  freshman | eng2  |   4   |
|-----------|-------|-------|
|  freshman | eng3  |   5   |
|-----------|-------|-------|
|  senior   | eng2  |   4   |
|-----------|-------|-------|
|  senior   | eng3  |   4   |
|-----------|-------|-------|

...我想创建一个以 "lecture "为键,以 "count "为值的map,怎样才能得到如下的输出?

|-----------|----------------------------|
|   grade   |    lecture per count       |
|-----------|----------------------------|
|  freshman | {eng1:3, eng2:4, eng3:5}   |
|-----------|----------------------------|
|  senior   | {eng2:4, eng3:4}           |
|-----------|----------------------------|
brtdzjyr

brtdzjyr1#

如果你能接受 "count "是一个 "字符串",你可能可以使用hive的 "str_to_map() "函数来获得一个所需的 "map",这将需要几个初步的步骤,以它所接受的方式来重新格式化列值。

select 
  grade, 
  str_to_map(course_list,',',':') lecture_count_map
from (
  select 
    grade, 
    concat_ws(',',
      collect_list(concat_ws(':', lecture, cast(count as string)))
    ) course_list
  from courses
  group by grade
) T;

输出。

grade       lecture_count_map
1   freshman    {"eng1":"3","eng2":"4","eng3":"5"}
2   senior      {"eng2":"4","eng3":"5"}

否则,你就得写自己的udaf或者使用第三方构建的现有udaf,至少在jira-4966解决之前是这样的(虽然7年后这种可能性很低)。

相关问题