Hive 中结构体的正确使用

Jas*_*son 5 sql arrays struct hive hiveql

我想使用一个包含字符串和数组的结构。该字符串表示服务的名称,而数组则列出执行该服务的公司 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;
Run Code Online (Sandbox Code Playgroud)

这给了我以下内容:

>{"type":"Cleaning","provider":[587,887]}
Run Code Online (Sandbox Code Playgroud)

但是,我想考虑同一财产上的多种服务类型。我的结构中怎么可能有不止一种类型service

理想情况下,我希望实现类似于以下内容的目标:

{"type":"清洁","provider":[587,887]}, {"type":"定价","provider":[932]}, {"type":"安全","provider":[ 187,577,946]}

这样我就可以在列中存储多个服务以及提供该服务的提供商。这个模型可以使用结构体来实现吗?

lef*_*oin 4

这可以通过以下方式实现array<struct<type: STRING, provider: ARRAY<INT>>>

创建表:

CREATE TABLE struct_test
(
 property_id INT,
 service array<STRUCT<
                type: STRING
               ,provider: ARRAY<INT>
               >>
);
Run Code Online (Sandbox Code Playgroud)

插入数据:

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;
Run Code Online (Sandbox Code Playgroud)

检查数据:

select t.property_id, t.service from struct_test t;
Run Code Online (Sandbox Code Playgroud)

结果:

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

如果您想在选择中收集结构数组而不是硬编码值,请参阅此答案:https ://stackoverflow.com/a/48175749/2700344

对于如此复杂的数据类型,你肯定需要brickhouse