2016-09-08 2 views
2

Ich bin völlig neu in Hive und Stack Overflow. Ich versuche, eine Tabelle mit dem komplexen Datentyp "STRUCT" zu erstellen und sie dann unter Verwendung INSERT INTO TABLE in Hive aufzufüllen.Wie fügen Sie Daten in komplexen Datentyp "Struct" in Hive

Ich verwende den folgenden Code:

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; 

ich die folgende Fehlermeldung erhalten:

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>.

konnte ich mit Erfolg einen ähnlichen Code verwenden, zu erstellen und einen Datentyp Array bevölkern aber habe Schwierigkeiten mit Struct. Ich habe viele Codebeispiele ausprobiert, die ich online gefunden habe, aber keine von ihnen scheint für mich zu funktionieren ... Ich würde wirklich etwas Hilfe bei dieser Sache zu schätzen wissen, da ich schon eine ganze Weile daran festhalte! Vielen Dank.

+0

Vorsicht, nulls mehr Mühe https://issues.apache.org/jira/browse/HIVE-4022 – Chris

Antwort

4

Ihr SQL-Fehler. Sie Funktion 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

Könnten Sie uns bitte wissen lassen, welche Version des Bienenstocks Sie getestet haben? –

+0

@sandeeprawat, teste ich diese Sql auf Hive-0.11.0 und Hive-2.0.0. Es funktioniert gut. – aaronshan

+0

@aaronshan, deine Antwort hat perfekt funktioniert, vielen Dank, dass dieses Problem mich stundenlang Schmerzen verursacht hat! Ich glaube, ich benutze Hive Version 1.1.0. – data101

0

Hive unterstützt keine Literale für komplexe Typen (array, Karte, struct, union), so ist es nicht möglich, sie in INSERT INTO zu verwenden ... VALUES-Klauseln. Dies bedeutet, dass der Benutzer mit der INSERT INTO ... VALUES-Klausel keine Daten in eine komplexe Datentypspalte einfügen kann. link

6

Sie keine komplexen Datentyp einfügen können direkt in Hive.For Einfügen structs haben: Sie sollten SQL verwenden. Sie müssen eine Dummy-Tabelle mit Daten erstellen, die Sie in die Structs-Spalte der gewünschten Tabelle einfügen möchten. wie in Ihrem Fall eine Dummy-Tabelle erstellen

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

dann in gewünschter Tabelle einzufügen tun

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

ist möglich:

Sie müssen den Spaltennamen in Satz von Dummy oder anderer Tabelle geben .

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

Oder

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

müssen keine Dummy-Tabelle erstellen: nur Befehl:

insert into struct_test 
select named_struct("houseno","house_number","streetname","xxxy","town","town_name","postcode","postcode_name"); 
Verwandte Themen