2016-09-26 6 views
1

Iは以下のようにEMP_TESTハイブテーブルを持っている文字列を>>> >Hiveで配列の長さが未知の構造のネストされた配列を展開するには?ストリング、テスト:配列<構造体<テスト・タイプ:文字列、errorline:配列<構造体<コードとして列<br> 'テスト' として</p> <p>'名前'

と列の値を有する: "JOHN" として "名称" と

として "テスト" [{ "コード": "cod1234"、 "テスト":[{ "テスト・タイプ" の "Java" を、 "errorline": "10000"}、{"testtype": "C++"、 "errorline": "10000"}}}
{"cod {"testtype": "hive"、 "errorline": "10"}、{"testtype": "pig"、 "errorline": "978"}、{"テスト・タイプ ":" スパーク」、 "errorline": "35"}]} ]

JOHN cod1234などの別のテーブルemp_test_detail(名前、コード、テスト・タイプ、errorline)にこれらの値とストアを選択する方法ジャワ100
JOHN cod1234 C++ 10000
ジョンジョンcod6790豚は978
JOHNスパークcod6790
10ハイブcod6790 35

私は、クエリの下にしようとしたが、エラーを持っている:


emp_tasting.code、
emp_tasting.emp_tests.testtypeを選択emp_test_detailに挿入、EMP_TEST
横から見た
emp_tasting.emp_tests.errorlineは(テスト)爆発emp_tastingとしてmytest
emp_tastingとしてmytestをテストします(testing [0] .tests)。

ここでは、テスト配列の正確な長さはわかりません。どのように配列フィールドを参照するのですか?

どうすればよろしいですか?

答えて

0

例クエリでは、エラーはemp_tastingを使用している可能性があります。lateral view explode行の同じ列の別名です。彼らは別の別名を持つ必要があります。

配列を2レベル深くアンネストするには、最初の配列を展開してから、その展開された配列のエイリアスを参照して入れ子配列を展開する必要があります。

はたとえば、あなたが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には2つのエイリアスが追加されていますが、fi最初は生成するテーブル式、2番目は列の式です。

したがって、この例では

LATERAL VIEW explode(testing) testingarray as testingelement

testingarray表の別名で、testingelementあなたは、構造体の中のフィールドを抽出するために参照する必要が配列列の別名です。最初は、あなただけのテーブルからとネストされた配列から直接フィールドを望んでいたなら、あなたは、単一の側面図が

LATERAL VIEW explode(testing.tests) testsarray as test

に爆発行うことによって、そのクエリをショートカットすることができます

を爆発スキップ

それはまた、空の配列を爆発させ、*星の展開を使うことができないので、フィールド名を明示的に参照する必要があるという問題があります。それは悪いことではありません。

クエリで配列インデックスを使用する必要があるのは悪いことです。 field[0]を書いてすぐに、何かがファンキーなにおいをします。そうすれば、配列の最初の要素がすべて得られ、非常に限定されたアプリケーションになります。

関連する問題