2016-05-17 7 views
0

SCHRITT 1: Ich habe eine UDF geschrieben, die 2 oder mehr Struct Spalten wie Autos, Fahrräder, Busse bilden wird. Auch die UDF nimmt einige Informationen aus anderen Ansichten namens 'Details'.So erstellen Sie eine Ansicht für Strukturfelder im Stock

cars struct form is: ARRAY<STRUCT<name:string, mfg:string, year:int>> 
bikes struct form is: ARRAY<STRUCT<name: string, mfg:string, year: int, price: double>> 
buses struct form is: ARRAY<STRUCT<name: string, mfg:string, year: int, price: double>> 

Ich schaffe einen Blick ‚Fahrzeuge‘ mit dieser UDF wie unten

ADD JAR s3://test/StructFV-0.1.jar; 
CREATE TEMPORARY FUNCTION TEST_STRUCT AS "com.test.TestStruct"; 

CREATE DATABASE IF NOT EXISTS ranjith; 
USE ranjith; 
DROP VIEW IF EXISTS vehicles; 
CREATE VIEW vehicles AS 
SELECT t.cars, t.bikes, t.buses 
FROM details d LATERAL VIEW TEST_STRUCT(d.data) t AS 
cars, bikes, buses; 

SCHRITT 2: Ich möchte jede Struktur Spalte in eine andere Ansicht zu explodieren. Wenn ich die folgende Abfrage versuchen, ich bin immer Fehler wie

USE ranjith; 
DROP VIEW IF EXISTS cars; 
CREATE VIEW cars AS 
SELECT c.name as name, c.mfg as mfg, c.year as year 
FROM vehicles v LATERAL VIEW EXPLODE (v.cars) exploded_table as c; 

Hinweis „Die Anzahl der Aliase in der AS-Klausel angegeben wird, stimmt nicht mit der Anzahl der Spalten, ausgegeben durch den erwarteten UDTF überein“: Wenn ich UDF habe mit nur Autos struct, funktioniert gut. Problem nur dann, wenn die UDF mehr als eine STRUCT enthält.

Irgendwelche Hilfe?

+0

pls. http://stackoverflow.com/questions/11373543/explode-the-array-of-struct-in-hive –

+0

hi ram. Ich habe die Frage aktualisiert. jede Hilfe plz? –

Antwort

0

Teilweise unvollständige Antwort unten, weil Sie nicht genug Informationen wie den UDF-Namen oder die Struktur/den Namen der Tabelle, die Sie abfragen, enthalten, aber es sollte genug sein, um Sie in Gang zu bringen.

können Sie eine Ansicht erstellen, EXPLODE verwendet:

CREATE VIEW productview as 
    SELECT EXPLODE(myudf(..).product) 
     FROM mytable 

EXPLODE wird ein Array nehmen und 'explodieren' in eine Tabelle. EXPLODE ist in der Tat eine UDTF, Benutzerdefiniere Tabellenerzeugungsfunktion. Siehe https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-explode

0
USE ranjith; 
DROP VIEW IF EXISTS cars; 
CREATE VIEW cars AS 
SELECT c.name as name, c.mfg as mfg, c.year, b.name AS bike_name, bb.name AS    bus_name 
FROM vehicles v LATERAL VIEW EXPLODE (v.cars) exploded_table as c LATERAL VIEW  EXPLODE (v.bikes) exploded_table2 AS b LATERAL VIEW EXPLODE (v.buses) exploded_table3 AS bb; 
0

Das Problem ist Ihre Ansicht

CREATE VIEW vehicles AS 
SELECT t.cars, t.bikes, t.buses 
FROM details d LATERAL VIEW TEST_STRUCT(d.data) t AS 
cars, bikes, buses; 

Ihre Datentypen ARRAY von STRUCT sind, so dass Ihre Seitenansicht zu TEST_STRUCT (d.data) nur ein Alias ​​benötigt, für die STRUCT Spalte, ist zurück gekommen.

z.B.

CREATE VIEW vehicles AS 
SELECT columnAlias.cars, columnAlias.bikes, columnAlias.buses 
FROM details d LATERAL VIEW TEST_STRUCT(d.data) tableAlias AS columnAlias;