我有一张这样的table:
|customer|category|room|date|
-----------------------------
|1 | A | aa | d1 |
|1 | A | bb | d2 |
|1 | B | cc | d3 |
|1 | C | aa | d1 |
|1 | C | bb | d2 |
|2 | A | aa | d3 |
|2 | A | bb | d4 |
|2 | C | bb | d4 |
|2 | C | ee | d5 |
|3 | D | ee | d6 |
我想从表中创建两个Map:
1.Map\客户\房间\日期:将按客户分组,收集所有不同的房间(钥匙)和日期(价值)。
我用的是 collect()
自定义函数brickhouse函数。
可以使用类似的方式存档:
select customer, collect(room,date) as map_customer_room_date
from table
group by customer
第二,Map种类房间日期有点复杂,也由相同的Map类型组成 collect(room, date)
它将包含所有类别的所有房间作为钥匙,其中客户x是类别。这意味着,对于客户1来说,它需要空间 ee
即使它属于客户2。这是因为customer1具有类别 C
这一类也出现在客户2中。
最后一个表按客户分组,如下所示:
|customer| map_customer_room_date | map_category_room_date |
-------------------------------------------------------------------|
| 1 |{aa: d1, bb: d2, cc: d3} |{aa: d1, bb: d2, cc: d3,ee: d6}|
| 2 |{aa: d3, bb: d4, ee: d6} |{aa: d3, bb: d4, ee: d6} |
| 3 |{ee: d6} |{ee: d6} |
我在构建第二个Map和呈现所描述的最终表时遇到问题。你知道怎么做到吗?
1条答案
按热度按时间f8rj6qna1#
这可以通过使用一系列自连接来完成,在将结果合并到2个Map之前,先查找同一类别中的其他房间。
代码
结果集
解释
首先,从初始数据中得出结果
table
. 我们把这种关系命名为customer_rooms
. 正如你在问题中已经指出的那样,这已经足够了map_customer_room_date
.第一个自联接标识与中明确提到的房间具有相同类别的所有房间
customer_rooms
排。我们把这种关系命名为category_rooms
.第二个self-join使用我们在中标识的房间
category_rooms
并试图找出这个房间是否已经被customer_rooms
. 我们把这种关系命名为customer_category_rooms
. 这是一个LEFT OUTER JOIN
,因为我们希望保留先前联接中的所有行。结果要么是1)来自customer_rooms
以及customer_category_rooms
是相同的,因为客户已经拥有这个房间,或者2)来自customer_category_rooms
就这样了NULL
,因为客户没有持有这个房间,但它是属于同一类别的房间。这一区别将变得重要,以便我们能够保护date
如果他们已经占用了房间。接下来,我们需要过滤。
这包括客户在原始文件中明确持有的房间
table
.这包括不由客户持有但与客户持有的房间属于同一类别的房间。
collect(
COALESCE(customer_category_rooms.room, category_rooms.room),
COALESCE(customer_category_rooms.date, category_rooms.date)) AS map_category_room_date