Hive 如何在配置单元中分解数组长度未知的嵌套结构数组?

Hive 如何在配置单元中分解数组长度未知的嵌套结构数组?,hive,Hive,我有一个蜂巢表emp_测试,如下所示: 'name' as string <br> 'testing' as array< struct < code:string,tests:array < struct < testtype:string,errorline:string>>>> “名称”作为字符串 “测试”作为数组

我有一个蜂巢表emp_测试,如下所示:

'name' as string <br>
'testing' as array< struct < code:string,tests:array < struct < testtype:string,errorline:string>>>>
“名称”作为字符串
“测试”作为数组>
列值为:“name”为“JOHN”,而“testing”为

[{“code”:“cod1234”,“tests”:[{“testtype”:“java”,“errorline”:“100”},{“testtype”:“C++”,“errorline”:“10000”},
{“code”:“cod6790”,“tests”:[{“testtype”:“hive”,“errorline”:“10”},{“testtype”:“pig”,“errorline”:“978”},{“testtype”:“spark”,“errorline”:“35”} ]
如何选择这些值并存储在另一个表中

emp_test_detail(name,code,testtype,errorline) as

JOHN cod1234 java       100 <br>
JOHN cod1234 C++        10000<br>
JOHN cod6790 hive       10<br>
JOHN cod6790 pig        978<br>
JOHN cod6790 spark      35<br>
emp\u测试详细信息(名称、代码、测试类型、错误行)如下
JOHN cod1234 java 100
约翰COD1234 C++ 10000 JOHN cod6790蜂巢10
约翰cod6790猪978
JOHN cod6790 spark 35
我已尝试以下查询,但出现错误:

*insert into emp_test_detail select <br>
        emp_tasting.code, <br>
        emp_tasting.emp_tests.testtype, <br>
        emp_tasting.emp_tests.errorline from emp_test <br> 
lateral view explode(testing) mytest as emp_tasting <br>
lateral view explode(testing[0].tests) mytest as emp_tasting;* <br>
*插入emp测试详细信息选择
emp_品尝代码,
emp_detacing.emp_tests.testtype,
emp_品尝。emp_测试。emp_测试的错误线路
侧视图爆炸(测试)mytest作为emp_测试
侧面视图爆炸(测试[0]。测试)mytest作为emp_;*
这里我不知道测试数组的确切长度。那么如何引用数组字段呢


请在这方面帮助我?

在您的示例查询中,错误可能与使用
emp\u
有关,这两个
横向视图分解
行使用相同的列别名。他们需要有不同的别名

若要将阵列取消嵌套两层,需要分解第一个阵列,然后在分解嵌套阵列时参考分解阵列的别名

例如,您需要
name、code、testtype、errorline

name
可直接在表中找到
code
在第一次分解时可用
testtype
errorline
可从嵌套分解中获得

请注意,我查看的是您的模式,而不是您列出的数据,这更便于我进行推理

此查询应满足您的要求

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后面添加了两个别名,第一个用于它生成的表表达式,第二个用于列

所以在这个例子中

侧视图分解(测试)测试作为测试元素排列

testingarray
是表别名
testingelement
是提取结构中的字段时需要引用的数组列别名

跳过第一次爆炸

如果您只需要直接从表和嵌套数组中获取字段,则可以通过执行单个横向视图分解来缩短该查询

侧视图分解(testing.tests)测试作为测试

问题是它也会分解空数组,并且不能使用*星形扩展,必须显式引用字段名。这不是一件坏事

一件坏事是必须在查询中使用数组索引。当你开始写
字段[0]
时,有些东西闻起来很怪。这只会得到数组的第一个元素,正如您所说的,它依赖于事先知道数组的大小,这将有非常有限的用例

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;