我在配置单元中有2个具有Order和Order_Detail的表(具有1:n关系,并在order_id上联接),我试图利用配置单元复杂数据类型-map [struct]加载到单个表中。
假设ORDER具有以下数据,
Order_id total_amount客户
123 10.00 1
456 12.00 2
和ORDER_DETAILS有
Order_id Order_Item_id Item_amount Item_type
123 1 5.00 A
123 2 5.00乙
456 1 6.00 A
456 2 3.00乙
456 3 3.00摄氏度
我想用所有订单列和order_detail列作为结构图创建单个表ORDERS。这有助于我将相关数据和查询结合在一起,从而避免频繁的联接。我尝试使用带有相应Serde的txt / json文件输入来加载具有复杂数据类型的表格,并且效果很好。但是在这种情况下,我想将ORCFile格式的现有2个配置单元表中的数据加载到新表中。已经使用named_struct函数尝试了一些基本的插入操作,但是它分别加载了每一行,并且没有将相同的order_id合并到一行中。
预期输出类似,
123 10.00 1 [1:{5.00,A},2:{5.00,B}]
456 12.00 2 {1:{6.00,A},2:{3.00,B},3:{3.00,C}]
但是我明白了
123 10.00 1 [1:{5.00,A}]
123 10.00 1 [2:{5.00,B}]
456 12.00 2 {1:{6.00,A}]
456 12.00 2 {2:{3.00,B}]
456 12.00 2 {3:{3.00,C}]
请帮助我了解仅通过从2个表中选择INSERT INTO表来实现此目的的方法。提前致谢。
我找到了一种使用map,named_struct函数以及David Worms在to_map UDF博客上发布的自定义UDF to_map的方法。这是样本
CREATE TABLE ORDER(
order_id bigint,
total_amount bigint,
customer bigint)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';
CREATE TABLE ORDER_DETAILS(
order_id bigint,
Order_Item_id bigint,
Item_amount bigint,
Item_type string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';
CREATE TABLE ORDERS(
order_id bigint,
Order_Items map < bigint, struct < Item_amount: bigint, Item_type: string >> ,
total_amount bigint,
customer bigint)
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat';
Insert overwrite table ORDERS
select
a.order_id,
a.order_items,
b.total_amount,
b.customer
from
(select order_id as order_id,
to_map(order_item_id, named_struct("item_amount", item_amount, "item_type", item_type)) as order_items from ORDER_DETAILS group by order_id) a
JOIN ORDER b ON(a.order_id = b.order_id);
从ORDERS中选择*;
123 {1:{“ Item_amount”:5,“ Item_type”:“ A”},2:{“ Item_amount”:5,“ Item_type”:“ B”}}} 10 1
456 {1:{“ Item_amount”:6,“ Item_type”:“ A”},2:{“ Item_amount”:3,“ Item_type”:“ B”},3:{“ Item_amount”:3,“ Item_type” :“ C”}} 12 2
希望这对大家有帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句