2016-05-17 2 views
0

ШАГ 1: Я написал UDF, который сформирует 2 или более столбца Struct, таких как автомобили, велосипеды, автобусы. Также UDF берет некоторую информацию из другого представления под названием «детали».Как создать представление для структурных полей в кусте

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

Я создаю вид «транспортные средства», используя эту UDF, как показано ниже

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; 

ШАГ 2: Я хочу, чтобы взорвать каждый столбец STRUCT в другой точке зрения. Когда я пытаюсь ниже запрос, я получаю сообщение об ошибке, как «число псевдонимов, поставляемых в предложении AS не совпадает с количеством выходных столбцов в UDTF ожидается»

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; 

Примечание: Если у меня есть UDF с только автомобили строятся, отлично работают. Облицовка возникает только в том случае, если UDF содержит более одной СТРУКТУРЫ.

Любая помощь?

+0

pls. посмотрите на http://stackoverflow.com/questions/11373543/explode-the-array-of-struct-in-hive –

+0

hi ram. Я обновил вопрос. любая помощь plz? –

ответ

0

Частично неполный ответ ниже, потому что вы не указали достаточную информацию, такую ​​как имя UDF, или структуру/имя таблицы, с которой вы запрашиваете, но этого должно быть достаточно, чтобы вы начали.

Вы можете создать представление, которое использует EXPLODE:

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

EXPLODE примет массив и «взрываются» в таблицу. EXPLODE на самом деле является UDTF, User Define Table-generate Function. См 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

Проблема ваш взгляд

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; 

Ваши типы данных ARRAY из STRUCT, так что ваш LATERAL VIEW к TEST_STRUCT (d.data) необходим только один псевдоним, для столбца STRUCT, что возвращается.

например.

CREATE VIEW vehicles AS 
SELECT columnAlias.cars, columnAlias.bikes, columnAlias.buses 
FROM details d LATERAL VIEW TEST_STRUCT(d.data) tableAlias AS columnAlias; 
Смежные вопросы