sql—在配置单元中正确使用结构

jobtbby3  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(534)

我想使用一个包含字符串和数组的结构。字符串表示服务的名称,而数组列出执行该服务的公司ID。
我知道我可以创建并插入结构外观,以便:

CREATE TABLE struct_test
(
 property_id INT,
 service STRUCT<
                type: STRING
               ,provider: ARRAY<INT>
               >
);

INSERT INTO TABLE struct_test 
    SELECT 989, NAMED_STRUCT('type','Cleaning','provider', ARRAY(587, 887)) AS address 
    FROM tmp LIMIT 1;

这给了我以下信息:

>{"type":"Cleaning","provider":[587,887]}

但是,我想说明同一属性上的多个服务类型。我的电脑里怎么会有不止一种类型 service 结构?
理想情况下,我希望实现以下类似的目标:
{“type”:“cleaning”,“provider”:[587887]},{“type”:“pricing”,“provider”:[932]},{“type”:“security”,“provider”:[187577946]}
通过这种方式,我可以在列中存储多个服务以及提供该服务的提供者。这个模型可以用struct实现吗?

czfnxgou

czfnxgou1#

这可以通过 array<struct<type: STRING, provider: ARRAY<INT>>> 创建表:

CREATE TABLE struct_test
(
 property_id INT,
 service array<STRUCT<
                type: STRING
               ,provider: ARRAY<INT>
               >>
);

插入数据:

with 
test_data as(
    SELECT 989 property_id, array(NAMED_STRUCT('type','Cleaning','provider', ARRAY(587, 887)),
                      NAMED_STRUCT('type','Pricing','provider', ARRAY(932))
                      ) as service
)

INSERT INTO TABLE struct_test 
select * from test_data;

检查数据:

select t.property_id, t.service from struct_test t;

结果:

OK
property_id     service
989     [{"type":"Cleaning","provider":[587,887]},{"type":"Pricing","provider":[932]}]
Time taken: 0.064 seconds, Fetched: 1 row(s)

如果要在select中收集结构数组,而不是硬编码的值,请参见以下答案:https://stackoverflow.com/a/48175749/2700344
对于如此复杂的数据类型,您肯定需要brickhouse库

相关问题