如何从另一个平面/简单配置单元表加载带有map[structs]的配置单元表

t3psigkw  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(320)

我在配置单元中有两个表,它们有order和order\u detail(具有1:n关系,并按order\u id连接),我正试图利用配置单元复杂的数据类型-map[struct]将它们加载到一个表中。
如果订单上有以下数据,
订单id客户总金额
123 10.00 1
456 12.00 2
订单详细信息
订单\标识订单\项目\标识项目\金额项目\类型
123 1 5.00安
公元前123年2月5日
456 1 6.00安
公元前456年2月3日
456 3.00摄氏度
我想用所有order列和order\u detail列作为结构的Map来创建单表orders。这有助于将相关数据和查询组合在一起,从而避免频繁的连接。我试着用txt/json文件加载带有复杂数据类型的表,这些文件是用各自的serde输入的,效果很好。但是在这个场景中,我想将orcfile格式的现有2个配置单元表中的数据加载到新表中。我们尝试了一些使用命名结构函数的基本插入,但它分别加载每一行,并且不会将相同的顺序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个表。提前谢谢。

nimxete2

nimxete21#

我找到了一种方法,使用map,命名为结构函数和david worms发布到自定义自定义自定义Map博客的自定义自定义自定义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);

从订单中选择*;
123{1:{“项目金额”:5,“项目类型”:“a”},2:{“项目金额”:5,“项目类型”:“b”}}10 1
456{1:{“项目金额”:6,“项目类型”:“a”},2:{“项目金额”:3,“项目类型”:“b”},3:{“项目金额”:3,“项目类型”:“c”}12 2
希望这对大家都有帮助。

相关问题