2016-09-26 52 views
1

我有一个蜂房表emp_test如下:如何在Hive中爆炸未知数组长度的嵌套数组结构?

'名称' 作为字符串
'测试' 作为阵列<结构<代码:串,测试:阵列<结构< testtype:串,errorline:串>>> >

和具有列值: “名称” 为 “JOHN” 和 “测试” 作为

[{ “代码”: “cod1234”, “测试”:[{ “testtype”: “Java” 的“errorline”: “100”},{ “testtype”: “C++”, “errorline”: “10000”}]},
{“鳕鱼E “:” cod6790" , “测试”:[{ “testtype”: “蜂巢”, “errorline”: “10”},{ “testtype”: “猪”, “errorline”: “978”},{” testtype “:” 火花”, “errorline”: “35”}]} ]

如何选择这些值,并存储在另一个表emp_test_detail(名称,代码testtype,errorline)作为

JOHN cod1234的java 100
JOHN cod1234 C++ 10000
JOHN cod6790蜂房10
JOHN cod6790猪978
JOHN cod6790火花35

我已经尝试下面的查询,但得到的错误:

插入件插入emp_test_detail选择
emp_tasting.code,
emp_tasting.emp_tests.testtype,
emp_tasting.emp_tests.errorline从emp_test
侧视图爆炸(测试) mytest as emp_tasting
lateral view explode(testing [0] .tests)mytest as emp_tasting;

,在这里我不知道测试阵列的确切长度。那么如何引用数组字段?

请帮我在这?

回答

0

在您的例子查询错误很可能与使用emp_tasting,同一列别名都lateral view explode线。他们需要有不同的别名。

要取消嵌套的数组两层深,你需要爆炸第一阵列,然后爆炸嵌套数组时,指的是爆炸阵列的别名。

例如,你想name, code, testtype, errorline

name可直接在表 code可从第一爆炸 testtypeerrorline可从嵌套爆炸。

注我在看你的模式,而不是你所列出的数据,很容易对我来说,推理

此查询应该做你想做的

SELECT 
    name, 
    testingelement.code, 
    test.testtype, 
    test.errorline 
FROM emp_test 
LATERAL VIEW explode(testing) testingarray as testingelement 
LATERAL VIEW explode(testingelement.tests) testsarray as test; 

表和列别名

请注意,explode在它后面添加了两个别名,fi首先是为它生成的表格表达式,第二种是针对列的。所以在这个例子

LATERAL VIEW explode(testing) testingarray as testingelement

testingarray

是表别名,testingelement是需要引用来提取结构中的字段的阵列列别名。

跳过第一爆炸

如果你只想领域直接从表和嵌套数组,那么你可以通过做一个横向视图快捷该查询爆炸到

LATERAL VIEW explode(testing.tests) testsarray as test

问题在于它会爆炸空数组,并且你不能使用星号扩展,你必须显式引用字段名称。这不是一件坏事。

什么是坏的是必须在查询中使用数组索引。只要你开始写field[0]那么有些东西闻起来很怪异。这只会让每一个获得数组的第一个元素,这将有非常有限的应用程序。