web-dev-qa-db-ja.com

Hiveで複雑なデータ型 "Struct"にデータを挿入する方法

私は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;

次のエラーが発生します。

ステートメントのコンパイル中にエラーが発生しました:失敗:semanticException [エラー10044]:列番号タイプが異なるため、ターゲットに挿入できません 'struct_test':列0をstructからarray>に変換できません。

同様のコードを使用してデータ型配列の作成とデータ入力に成功しましたが、Structで問題が発生しています。私はオンラインで見つけたコード例をたくさん試しましたが、どれも私のために機能していないようです...私は今しばらくそれにこだわっていたので、これに関するいくつかの助けに本当に感謝します!ありがとう。

7
data101

あなたのSQLエラー。あなたはsqlを使うべきです:

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

複合データ型をHiveに直接挿入することはできません。構造体を挿入するには、named_struct関数を使用します。目的のテーブルの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;
9
Amit_Hora

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

insert into struct_test
select named_struct("houseno","house_number","streetname","xxxy","town","town_name","postcode","postcode_name");
5
Suman Kumar

可能です:

ダミーまたは他のテーブルの文で列名を指定する必要があります。

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
Carlos Gomez