精华内容
下载资源
问答
  • lateralView: LATERAL VIEW udtf(expression) tableAlias AS columnAlias (','columnAlias)* fromClause: FROM baseTable (lateralView)* 用法描述 lateral view 要与UDTF函数一起使用,比如 explode() 函数。...

    Hive: lateral view 用法

    lateral view 的语法格式

    lateralView: 
    LATERAL VIEW udtf(expression) tableAlias AS columnAlias (',' columnAlias)* 
    fromClause: FROM baseTable (lateralView)*

    用法描述

    lateral view 要与UDTF函数一起使用,比如 explode() 函数。这里的UDTF函数是指用户自定义的表生成函数(英文全称:user defined table-generating functions),它可以接受一行输入然后产生0行或多行输出。

    lateral view 首先将utdf函数应用到每一行上,这时每一行经utdf处理后得到多行输出,这些输出将会组建成一张虚拟表,然后这张虚拟表会跟当前表进行join操作,join完成之后会得出一张结果虚拟表,这张结果表里就有了utdf生成的列,当然原表的列除了utdf消耗的列之外肯定也在都里面。

    示例说明

    考虑下面这张 pageAds 表:

    Column name

    Column type

    page_id

    String

    adid_list

    Array<int>

    里面有两行数据:

    page_id

    adid_list

    front_page

    [1,2,3]

    contact_page

    [3,4,5]

    这两行数据的意思是:front_page页有三条广告,id分别是1,2,3。contact_page页也有三条广告,id分别是3,4,5。

    现在需要解决的问题是:在所有页面中统计每条广告出现的次数,输出广告id和该广告出现的总次数。

    第一步:

    使用 lateral view 和 explore() 函数将 adid_list 列的 list 拆分,sql代码如下:

    SELECT page_id, ad_id 
    FROM pageAds 
    LATERAL VIEW explode(adid_list) adTable AS ad_id;

    可以得到以下结果:

    page_id (string)

    adid (int)

    "front_page"

    1

    "front_page"

    2

    "front_page"

    3

    "contact_page"

    3

    "contact_page"

    4

    "contact_page"

    5

    然后我们再使用 count/group by 语句统计出每个adid出现的次数:

    SELECT ad_id, count(1) 
    FROM pageAds 
    LATERAL VIEW explode(adid_list) adTable AS ad_id 
    GROUP BY ad_id

    得到最终结果:

    ad_id

    count(1)

    1

    1

    2

    1

    3

    2

    4

    1

    5

    1

    Multiple Lateral Views

    一个FROM子句可以包含多个LATERAL VIEW子句。 后续的LATERAL VIEW可以从出现在LATERAL VIEW左侧的任何表中引用列。

    具体案例:

    SELECT * 
    FROM exampleTable 
    LATERAL VIEW explode(col1) myTable1 AS myCol1 
    LATERAL VIEW explode(myCol1) myTable2 AS myCol2;

    实例表格:

    Array<int> col1

    Array<string> col2

    [1, 2]

    [a", "b", "c"]

    [3, 4]

    [d", "e", "f"]

    得到结果:

    int myCol1

    string myCol2

    1

    "a"

    1

    "b"

    1

    "c"

    2

    "a"

    2

    "b"

    2

    "c"

    3

    "d"

    3

    "e"

    3

    "f"

    4

    "d"

    4

    "e"

    4

    "f"

    outer lateral views

    later view 前面还可以加上一个 outer 关键字,这是为了避免 当udtf 没有得到任何结果时最终虚拟结果表里丢失原数据行的问题。具体来将,由于later view 的工作原理是将原表与 udtf 产生的虚拟表做 inner join 操作,所以如果 udtf 不产生任何结果时,那么对应原表的那一行也会在 inner join 操作后消失。outer关键字就是来解决这个问题的,加上这个关键字之后执行的就是 outer join 操作了,因此原表数据会被完全保留下来。

    例如,上面的 pageAds 表中如果有以下三行数据:

    page_id

    adid_list

    front_page

    [1,2,3]

    contact_page

    [3,4,5]

    end_page

    [ ]

    那么执行 lateral view 的sql:

    SELECT page_id, ad_id 
    FROM pageAds 
    LATERAL VIEW explode(adid_list) adTable AS ad_id;

    得到的结果将会是:

    page_id (string)

    adid (int)

    "front_page"

    1

    "front_page"

    2

    "front_page"

    3

    "contact_page"

    3

    "contact_page"

    4

    "contact_page"

    5

    可以看到,end_page 那一行消失了,因为它没有在 inner join 中关联到任何数据。因此如果想保留原表全部数据的话,就需要加上outer关键字:

    SELECT page_id, ad_id 
    FROM pageAds 
    OUTER LATERAL VIEW explode(adid_list) adTable AS ad_id;

    得到如下结果

    page_id (string)

    adid (int)

    "front_page"

    1

    "front_page"

    2

    "front_page"

    3

    "contact_page"

    3

    "contact_page"

    4

    "contact_page"

    5

    “end_page”

    <NULL>

    展开全文
  • hive Lateral View用法

    2020-08-20 03:33:05
    Lateral View 用于和 UDTF 函数(explode、split)结合来使用。 首先通过 UDTF 函数拆分成多行,再将多行结果组合成一个支持别名的虚拟表。 主要解决在 select 使用 UDTF 做查询过程中,查询只能包含单个 UDTF,不能...

    Lateral View 用于和 UDTF 函数(explode、split)结合来使用。
    首先通过 UDTF 函数拆分成多行,再将多行结果组合成一个支持别名的虚拟表。
    主要解决在 select 使用 UDTF 做查询过程中,查询只能包含单个 UDTF,不能包含其他字段、以及多个 UDTF 的问题

    语法:
    LATERAL VIEW udtf(expression) tableAlias AS columnAlias (’,’
    columnAlias)

    展开全文
  • Hive explode lateral view 用法

    千次阅读 2019-04-28 20:39:30
    lateral view UDTF(expression)tableAliasName as colAliasName 其中UDTF(expression)表示表生成函数说白了就是行转列的函数,即一行变为多行的函数,比如explode,当然也可以通过UDF自定义函数把一行转为多行,...

    类似于SqlServer的游标,把字段的内容转换成行显示。

    lateral view UDTF(expression) tableAliasName as colAliasName

    其中UDTF(expression)表示表生成函数说白了就是行转列的函数,即一行变为多行的函数,比如explode,当然也可以通过UDF自定义函数把一行转为多行,或者UDF返回Array,再通过explode炸成多行

    tableAliasName表示表的别名,colAliasName表示表的列的别名

    原理是:通过lateral view UDTF(expression)函数把一行转换为多行,会生成一个临时表,把这些数据放入这个临时表中,然后使用这个临时表和base表做inner join 使用的条件就是原始表的关系

    建表语句:

    create table sales_info_new(
    sku_id string comment '商品id',
    sku_name string comment '商品名称',
    state_map map<string,string> comment '商品状态信息',
    id_array array<string> comment '商品相关id列表'
    )
    partitioned by(
    dt  string comment '年-月-日'
    )
    row format delimited
      fields terminated by '|'
      collection items terminated by ','
      map keys terminated by ':';        

    从本地导入后,查询数据:

    ------

    SELECT explode(id_array) AS new_id FROM sales_info where dt = '2019-04-26'; -- 1列 10行
    

    ------

    explode(array):

    select sku_id,sku_name from sales_info lateral view explode(id_array) table_alias as id where dt = '2019-04-26'; -- 2列 10行,id列没有自动追加在后面
    
    select sku_id,sku_name ,id from sales_info lateral view explode(id_array) table_alias as id where dt = '2019-04-26';  -- 3列 10行,id列追加在后面
     
    select  * from sales_info lateral view explode(id_array) table_alias as id where dt = '2019-04-26';    -- 6列 10行,id列自动追加在后面

    lateral view:如果指定字段名则需要把lateral view查询出的列写到select中,才能在结果中出现;如果直接是select * 则自动会把lateral view查询出的列追加在后面;

    ------

    where 条件要写在lateral view 后面,不然报错

    select  * from sales_info  where dt = '2019-04-26' lateral view explode(id_array) table_alias as id;    -- 报错 2019-04-28 16:48:49,044 FAILED: ParseException line 1:51 missing EOF at 'lateral' near ''2019-04-26''
    

     array类型不能再按照逗号split,string类型才可以

    select  * from sales_info lateral view explode(split(id_array,',')) table_alias as id where dt = '2019-04-26';
    -- 2019-04-28 16:26:29,224 FAILED: ClassCastException org.apache.hadoop.hive.serde2.objectinspector.StandardListObjectInspector cannot be cast to org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector
    

     explode要与lateral view配合使用,不能单独出现在字段中!

    SELECT sku_id,sku_name,explode(id_array) AS new_id FROM sales_info where dt = '2019-04-26'; -- 2019-04-28 15:55:41,642 FAILED: SemanticException [Error 10081]: UDTF's are not supported outside the SELECT clause, nor nested in expressions

    ------

    explode(string)

    对  不含有逗号的字符串,含有多个逗号的字符串,均能正确进行explode逗号操作:

    不含有逗号的字符串:explode逗号后仍是一条记录;

    含有逗号的字符串:explode逗号后是多条记录

    ------

    explode(map)

    只有key,value两列,所以输出3列报错

    select explode(state_map) as (id,token,user_name) from sales_info where dt = '2019-04-26'; -- 2019-04-28 15:57:24,080 FAILED: SemanticException [Error 10083]: The number of aliases supplied in the AS clause does not match the number of columns output by the UDTF expected 2 aliases but got 3

    ------

    select explode(state_map) as (key,value) from sales_info where dt = '2019-04-26'; -- 2列 15行

    ------

    select sku_name from sales_info lateral view explode(state_map)  table_alias as key,value  where dt = '2019-04-26' -- 只有sku_name 1列 共15行
     
    select sku_name ,key,value from sales_info lateral view explode(state_map)  table_alias as key,value  where dt = '2019-04-26' -- 有3列共15行

    ------

    参考:https://blog.csdn.net/lyzx_in_csdn/article/details/85628867

    展开全文
  • split、explode、lateral view用法和区别split() 函数explode() 函数lateral view小结 split() 函数 是用于切分数据,就是将一串字符串,按照指定格式切割成了一个数组,标准格式为split(str,regex),支持正则切分 ...

    split、explode、lateral view用法和区别

    split() 函数

    是用于切分数据,就是将一串字符串,按照指定格式切割成了一个数组,标准格式为split(str,regex),支持正则切分

    对于 .| 这样的特殊字符,不加\转义符的时候是特殊字符,加了以后才是普通字符,而对于\d的字符,需要加\后才是特殊字符,就是是说\\d才是匹配数字。

    有一张表(demo)如下:
    在这里插入图片描述
    split()函数对name字段切分

    select 
    	split(name,',') as name,
    	age 
    from 
    	demo;
    

    结果如下,返回值是一个array数组
    在这里插入图片描述

    explode() 函数

    用于打散行的函数(将一行的数据拆分成多行,它的参数必须是map或array类型)。这个函数常和split()并用

    select 
    	explode(split(name,',')) as name 
    from 
    	demo;
    

    上述sql代码表示将name字段按 , 分割,再将得到的数组利用explode()打散成多行
    在这里插入图片描述
    上面这各视图我们只能看到name列,如果我写成

    select 
    	explode(split(name,',')) as name,
    	age
    from 
    	demo;
    

    是不是就可以得到nameage两列了呢。

    事实是hive不支持这样的操作,会报错
    在这里插入图片描述
    一个select后面只能获得一个explode()产生的视图,如果要显示多个列,则需要将多个视图合并。

    lateral view

    就是专门对拆分后的数据进行聚合的

    如下(将name列打散,age列不打散)

    select 
    	rename,
    	age 
    from 
    	demo 
    	lateral view explode(split(name,',')) temp as rename;
    	-- 命名成rename这样这句话好理解一点,不会和原来的name列搞混
    

    在这里插入图片描述

    如果将nameage同时打散合并

    select 
    	name,
    	age 
    from 
    	demo 
    	lateral view explode(split(name,',')) temp as name
    	lateral view explode(split(age,',')) temp as age;
    

    在这里插入图片描述
    可以看见,这时候两个later view合并,实际上是做了一个全连接。如果要一一对应可能只能自己写函数了。

    lateral view outer

    UDTF未产生行时,连接结果为空,如果想输入的行也输出,需要加上Outer关键字

    # 未加Outer关键字,输出内容为空
    select 
      name,
      course,
      col1
    from lateral_test
    lateral view explode(array()) temp as col1;
     
    +-------+---------+-------+
    | name  | course  | col1  |
    +-------+---------+-------+
    +-------+---------+-------+
     
    # 加上Outer关键字,输出不为空
    select 
      name,
      course,
      col1
    from lateral_test
    lateral view outer explode(array()) temp as col1;
     
    +---------+-----------+-------+
    |  name   |  course   | col1  |
    +---------+-----------+-------+
    | wadeyu  | c1,c2,c3  | NULL  |
    | tom     | c2,c3,c5  | NULL  |
    | polly   | c1,c2,c3  | NULL  |
    +---------+-----------+-------+
    

    小结

    lateral view用于和split(), explode()、等UDTF一起使用,它能够将一行数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。

    lateral view首先为原始表的每行调用UDTF,UDTF会把一行拆分成一或者多行,lateral view再把结果组合,产生一个支持别名表的虚拟表

    explode():
    作用:是将一行数据转成多行数据(列转行),只能用于array和map类型的数据。
    局限性:不能关联原有的表中的其他字段,不能和udtf嵌套使用

    lateral view:
    作用:为原始表的每行调用udtf,udtf会把一行数据拆分为多行,lateral view再把结果组合,产生一个支持别名的虚拟表,这样就解决了explode不能关联原有表其他字段的问题

    展开全文
  • Hive中的lateral view用法

    2020-12-20 17:19:59
    explode与lateral view在关系型数据库中本身是不该出现的,因为他的出现本身就是在操作不满足第一范式的数据(每个属性都不可再分),本身已经违背了数据库的设计原理(不论是业务系统还是数据仓库系统),不过...
  • Lateral View是Hive中提供给UDTF的conjunction,它可以解决UDTF不能添加额外的select列的问题。1. Why we need Lateral View?当我们想对hive表中某一列进行split之后,想对其转换成1 to N的模式,即一行转多列。...
  • Lateral View用法 与 Hive UDTF explode

    万次阅读 2014-05-16 19:11:26
    Lateral View是Hive中提供给UDTF的conjunction,它可以解决UDTF不能添加额外的select列的问题。 1
  • hive中的lateral view 用法详解上篇

    千次阅读 2016-05-17 11:16:18
    lateral view用于和split, explode等UDTF一起使用,它能够将一行数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。lateral view首先为原始表的每行调用UDTF,UDTF会把一行拆分成一或者多行,lateral view再...
  • hive中的lateral view 用法详解下篇

    千次阅读 2016-05-17 20:01:54
    例子 假设我们有一张表pageAds,它有两列数据,第...https://cwiki.apache.org/confluence/display/Hive/LanguageManual+LateralView#   http://blog.csdn.net/inte_sleeper/article/details/7196114
  • [Hive]Lateral View使用指南

    万次阅读 多人点赞 2017-03-17 19:07:25
    1. 语法lateralView: LATERAL VIEW udtf(expression) tableAlias AS columnAlias (',' columnAlias)* fromClause: FROM baseTable (lateralView)*2. 描述Lateral View一般与用户自定义表生成函数(如explode())结合...
  • hive lateral view 与 explode详解

    万次阅读 多人点赞 2016-07-16 21:28:14
    LATERAL VIEW udtf(expression) tableAlias AS columnAlias (’,’ columnAlias)* fromClause: FROM baseTable (lateralView)* Description Lateral view is used in conjunction with user-defined table ...
  • Lateral View 语法

    2019-09-24 23:00:56
    1 lateralView: LATERAL VIEW udtf(expression) tableAlias AS columnAlias (',' columnAlias)* 2 fromClause: FROM baseTable (lateralView)* Lateral View 描述 Lateral View 用于UDTF(u...
  • Lateral View和表生成函数(例如Split、Explode...lateralView: LATERAL VIEW [OUTER] udtf(expression) tableAlias AS columnAlias (',' columnAlias) * fromClause: FROM baseTable (lateralView)* Lateral view ou

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,584
精华内容 1,033
关键字:

lateralview用法