2016-09-08 11 views
2

私はHiveとStack Overflowについて全く新しいです。複雑なデータ型 "STRUCT"のテーブルを作成し、HiveにINSERT INTO TABLEを使用してテーブルを作成しようとしています。どのようにデータを複雑なデータ型 "構造体"に挿入するのですか?

CREATE TABLE struct_test 
(
address STRUCT< 
       houseno: STRING 
       ,streetname: STRING 
       ,town:  STRING 
       ,postcode: STRING 
       > 
); 

INSERT INTO TABLE struct_test 
SELECT NAMED_STRUCT('123', 'GoldStreet', London', W1a9JF') AS address 
FROM dummy_table 
LIMIT 1; 

私は次のエラーを取得する:

私は、次のコードを使用してい

Error while compiling statement: FAILED: semanticException [Error 10044]: Cannot insert into target because column number type are different 'struct_test': Cannot convert column 0 from struct to array>.

私が作成し、データ型の配列を移入するために、成功と同様のコードを使用することができましたが、構造体に問題があります。私はオンラインで見つけた多くのコード例を試しましたが、どれも私のためにはうまくいかないようです...私はかなり長い間それに取り組んできたので、これについていくつかの助けに本当に感謝します!ありがとう。

+0

用心、ヌルはhttps://issues.apache.org/jiraより多くの努力が必要/ブラウズ/ HIVE-4022 – Chris

答えて

4

あなたのSQLエラーです。あなたはHive.For挿入する構造体に直接、複雑なデータ型を挿入することはできませんあなたは、関数named_structを持って

INSERT INTO TABLE struct_test 
     SELECT NAMED_STRUCT('houseno','123','streetname','GoldStreet', 'town','London', 'postcode','W1a9JF') AS address 
      FROM dummy_table LIMIT 1; 
+0

あなたがテストしたハイブのバージョンをお知らせください。 –

+0

@sandeeprawat、私はこのSQLをhive-0.11.0とhive-2.0.0でテストします。それはうまく動作します。 – aaronshan

+0

@aaronshan、あなたの答えは完璧に働いた、この問題は私に痛みの時間を引き起こしていたので、ありがとう!私はHiveバージョン1.1.0を使用していると思います。 – data101

0

複合型(配列、マップ、構造体、共用体)のリテラルはサポートされていないため、INSERT INTO ... VALUES句でそれらを使用することはできません。つまり、ユーザーはINSERT INTO ... VALUES句を使用して複合データ型列にデータを挿入できません。 link

6

:あなたは、SQLを使用する必要があります。目的のテーブルの[Structs]列に挿入するデータを含むダミーテーブルを作成する必要があります。あなたのケースで と同様にダミーのテーブルを作成し

CREATE TABLE DUMMY (houseno: STRING 
      ,streetname: STRING 
      ,town:  STRING 
      ,postcode: STRING); 

次に、目的のテーブルに挿入するには

INSERT INTO struct_test SELECT named_struct('houseno',houseno,'streetname' 
        ,streetname,'town',town,'postcode',postcode) from dummy; 
0

は可能ですか:

あなたはダミーや他のテーブルからの文の列に名前を付ける必要があります。

INSERT INTO TABLE struct_test 
SELECT NAMED_STRUCT('houseno','123','streetname','GoldStreet', 'town','London', 'postcode','W1a9JF') AS address 
FROM dummy 

それとも

INSERT INTO TABLE struct_test 
SELECT NAMED_STRUCT('houseno',tb.col1,'streetname',tb.col2, 'town',tb.col3, 'postcode',tb.col4) AS address 
FROM table1 as tb 
0

任意のダミーテーブルを作成する必要はありません:だけのコマンドを使用します。

insert into struct_test 
select named_struct("houseno","house_number","streetname","xxxy","town","town_name","postcode","postcode_name"); 
関連する問題