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]}
这样我就可以在列中存储多个服务以及提供该服务的提供商。这个模型可以使用结构体来实现吗?
这可以通过以下方式实现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库