如何在配置单元中为结构字段创建视图

Posted

技术标签:

【中文标题】如何在配置单元中为结构字段创建视图【英文标题】:How to create view for struct fields in hive 【发布时间】:2016-05-17 17:20:28 【问题描述】:

第 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 步: 我想将每个结构列分解为另一个视图。 当我尝试以下查询时,我收到类似“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 包含多个 STRUCT 时才会出现问题。

有什么帮助吗?

【问题讨论】:

请。关注***.com/questions/11373543/… 嗨,公羊。我已经更新了这个问题。有什么帮助吗? 【参考方案1】:

以下部分不完整的答案,因为您没有包含足够的信息,例如 UDF 名称或您要查询的表的结构/名称,但它应该足以让您继续前进。

您可以创建一个使用 EXPLODE 的视图:

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

EXPLODE 将获取一个数组并将其“分解”成一个表。 EXPLODE 实际上是一个 UDTF,即用户定义表生成函数。见https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-explode

【讨论】:

【参考方案2】:
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;

【讨论】:

【参考方案3】:

问题在于你的观点

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;

您的数据类型是结构数组,因此您的横向视图 对于返回的 STRUCT 列,TEST_STRUCT(d.data) 只需要一个别名。

例如

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

【讨论】:

以上是关于如何在配置单元中为结构字段创建视图的主要内容,如果未能解决你的问题,请参考以下文章

如何从动态创建的表格视图单元格的输入字段中将数据检索到数组

如何在 swift 3 中为 UITable 视图提供单元格缩进级别?

如果链接字段的标题值在 drupal 7 视图中为空,如何隐藏标题?

如何在表格视图 IOS 内的滚动视图中创建文本字段

从 Swift (3.1) 表格视图中动态创建的单元格获取有序的文本字段数据

在集合视图中为单元格设置动画