首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在雅典娜(Presto)交叉连接UNNEST的蜂巢侧视外爆炸等效

在雅典娜(Presto)交叉连接UNNEST的蜂巢侧视外爆炸等效
EN

Stack Overflow用户
提问于 2019-08-27 18:58:55
回答 2查看 3.6K关注 0票数 1

我们正在雅典娜中创建一个Unnest视图,这相当于JSON数据的Hive横向视图,JSON数据中包含数组字段,如果unnest为null,则父ky将被删除。

下面是我们尝试创建视图的示例JSON。

代码语言:javascript
复制
{"root":{"colA":"1","colB":["a","b","c"]}}
{"root":{"colA":"2"}}

Hive视图中上述数据的输出如下:

代码语言:javascript
复制
+----------------------+----------------------+--+ 

| test_lateral_v.cola  | test_lateral_v.colb  |    
+----------------------+----------------------+--+ 

| 1                    | a                    |    
| 1                    | b                     
| 1                    | c                    |    
| 2                    | NULL                 |    
+----------------------+----------------------+--+ 

但是,当我们试图创建带有交叉连接的雅典娜视图时,下面是输出:

可乐可乐

代码语言:javascript
复制
1   a

1   b

1   c

如果JSON数据没有我们为其创建UNNEST的字段的值,则该行将从输出中删除,而hive则为该行提供相应的缺失值的空值。

/DDLs用于蜂箱/

代码语言:javascript
复制
create    external    table    if    not    exists    test_lateral(
root    struct<
 colA:    string,
 colB:    array<
  string
  >
 >
 )
ROW    FORMAT    SERDE    'org.apache.hive.hcatalog.data.JsonSerDe'
Stored    as    textfile 
location    "<hdfs_location>";

create view test_lateral_v 
(colA,colB)
as select
root.colA,
alias
from test_lateral
lateral view outer explode (root.colB) t as alias;

/DDLs用于雅典娜/

代码语言:javascript
复制
create external table if not exists test_lateral(
root struct<
 colA: string,
 colB: array<
  string
  >
 >
 )
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
Stored as textfile 

location "<s3_location>";

create view test_lateral_v 
as select
root.colA,
alias as colB
from test_lateral
cross join unnest (root.colB) as t (alias);
EN

回答 2

Stack Overflow用户

发布于 2019-08-27 21:06:05

选择* FROM (test_lateral交叉连接UNNEST)(合并(“根”.“colb”,arraynull)) t(别名)

作品

票数 2
EN

Stack Overflow用户

发布于 2019-10-02 19:05:52

显然,当非嵌套数组为空或空时,CROSS JOIN UNNEST不会生成任何行,但可以使用LEFT JOIN UNNEST

代码语言:javascript
复制
SELECT * test_lateral
LEFT JOIN UNNEST("root"."colb") t(alias) ON true;

这是从普雷斯托319开始提供的。在此之前,您可以使用coalesce将空数组替换为一个虚拟值。(这假定数据中没有空数组)。

代码语言:javascript
复制
SELECT *
FROM test_lateral
CROSS JOIN UNNEST(coalesce("root"."colb", ARRAY[NULL])) t (alias))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57680760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档