精华内容
下载资源
问答
  • 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

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

    2020-12-20 17:19:59
    explode与lateral view在关系型数据库中本身是不该出现的,因为他的出现本身就是在操作不满足第一范式的数据(每个属性都不可再分),本身已经违背了数据库的设计原理(不论是业务系统还是数据仓库系统),不过...

    explode与lateral view在关系型数据库中本身是不该出现的,因为他的出现本身就是在操作不满足第一范式的数据(每个属性都不可再分),本身已经违背了数据库的设计原理(不论是业务系统还是数据仓库系统),不过大数据技术普及后,很多类似pv,uv的数据,在业务系统中是存贮在非关系型数据库中,用json存储的概率比较大,直接导入hive为基础的数仓系统中,就需要经过ETL过程解析这类数据,explode与lateral view在这种场景下大显身手。

    hive> select * from test.user_log;
    OK
    user_log.userid	user_log.time	user_log.url
    Peter	2015-10-12 01:10:00	url1
    Peter	2015-10-12 01:15:10	url2
    Peter	2015-10-12 01:16:40	url3
    Peter	2015-10-12 02:13:00	url4
    Peter	2015-10-12 03:14:30	url5
    Marry	2015-11-12 01:10:00	url1
    Marry	2015-11-12 01:15:10	url2
    Marry	2015-11-12 01:16:40	url3
    Marry	2015-11-12 02:13:00	url4
    Marry	2015-11-12 03:14:30	url5
    

    当使用UDTF函数的时候,hive只允许对拆分字段进行访问的。

    hive> select userid, explode(split(time, '-')) from test.user_log;
    FAILED: SemanticException [Error 10081]: UDTF's are not supported outside the SELECT clause, nor nested in expressions
    

    这样写是可以的:

    select explode(split(time, '-')) from test.user_log;
    

    但是实际中经常要拆某个字段,然后一起与别的字段一起出.例如上面的id和拆分的array元素是对应的.我们应该如何进行连接呢?我们知道直接select id,explode()是不行的.这个时候就需要lateral view出场了。

    lateral view为侧视图,意义是为了配合UDTF来使用,把某一行数据拆分成多行数据.不加lateral view的UDTF只能提取单个字段拆分,并不能塞会原来数据表中.加上lateral view就可以将拆分的单个字段数据与原始表数据关联上。

    在使用lateral view的时候需要指定视图别名和生成的新列别名。

    select userid, a  from test.user_log lateral view explode(split(time, '-')) time_view as a;
    

    time_view为视图别名,a为指定新列别名。

    结果:

    userid	a
    Peter	2015
    Peter	10
    Peter	12 01:10:00
    Peter	2015
    Peter	10
    Peter	12 01:15:10
    Peter	2015
    Peter	10
    ...省略...
    

    lateral view explode 相当于一个拆分数组的虚表,然后根据userid将其与原表进行笛卡尔积关联.

    我们也可以多次使用lateral view explode

    select userid, a, a2  from test.user_log 
    lateral view explode(split(time, '-')) time_view as a 
    lateral view explode(split(time, '-')) time_view2 as a2;
    

    可想而知,做了笛卡尔集,由于explode里面拆分出来的数组长度是3,lateral view使用了2次,原始是10条数据,结果就是3*3,翻了9倍,一共90条:

    userid	a	a2
    Peter	2015	2015
    Peter	2015	10
    Peter	2015	12 01:10:00
    Peter	10	2015
    Peter	10	10
    Peter	10	12 01:10:00
    Peter	12 01:10:00	2015
    Peter	12 01:10:00	10
    Peter	12 01:10:00	12 01:10:00
    Peter	2015	2015
    Peter	2015	10
    Peter	2015	12 01:15:10
    Peter	10	2015
    ...省略...
    
    展开全文
  • Lateral View是Hive中提供给UDTF的conjunction,它可以解决UDTF不能添加额外的select列的问题。 1. Why we need Lateral View? 当我们想对hive表中某一列进行split之后,想对其转换成1 to N的模式,即一行转...

    https://blog.csdn.net/oopsoom/article/details/26001307

     

    Lateral View是Hive中提供给UDTF的conjunction,它可以解决UDTF不能添加额外的select列的问题。

    1. Why we need Lateral View?

    当我们想对hive表中某一列进行split之后,想对其转换成1 to N的模式,即一行转多列。

    hive不允许我们在UDTF函数之外,再添加其它select语句。

    如下,我们想将登录某个游戏的用户id放在一个字段user_ids里,对每一行数据用UDTF后输出多行。

     

    select game_id, explode(split(user_ids,'\\[\\[\\[')) as user_id   from login_game_log  where dt='2014-05-15' 

    FAILED: Error in semantic analysis: UDTF's are not supported outside the SELECT clause, nor nested in expressions。

     

    提示语法分析错误,UDTF不支持函数之外的select 语句,真无语。。。

    如果我们想支持怎么办呢?接下来就是Lateral View 登场的时候了。

    2. Lateral View explain

    2.1 单个Lateral View

    Lateral view is used in conjunction with user-defined table generatingfunctions such as explode(). As mentioned in Built-in Table-Generating Functions, a UDTF generates zero or more output rows foreach input row. A lateral view first applies the UDTF to each row of base tableand then joins resulting output rows to the input rows to form a virtual tablehaving the supplied table alias.

    解释一下:

     

    Lateral view 其实就是用来和像类似explode这种UDTF函数联用的。lateral view 会将UDTF生成的结果放到一个虚拟表中,然后这个虚拟表会和输入行即每个game_id进行join 来达到连接UDTF外的select字段的目的。

    Lateral View Syntax

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

    fromClause: FROM baseTable (lateralView)*

    可以看出,可以在2个地方用Lateral view:

    1. 在udtf前面用

    2. 在from baseTable后面用

     

    举个例子:

    1. 先创建一个文件,里面2列用\t分割,game_id和user_ids

     

    hive> create table test_lateral_view_shengli(game_id string,userl_ids string) row format delimited fields terminated by '\t' stored as textfile;

    OK

    Time taken: 2.451 seconds

    hive> load data local inpath '/home/hadoop/test_lateral' into table test_lateral_view_shengli;

    Copying data from file:/home/hadoop/test_lateral

    Copying file: file:/home/hadoop/test_lateral

    Loading data to table dw.test_lateral_view_shengli

    OK

    Time taken: 6.716 seconds

    hive> select * from test_lateral_view_shengli;                                                                                                           

    OK

    game101       15358083654[[[ab33787873[[[zjy18052480603[[[shlg1881826[[[lxqab110

    game66       winning1ren[[[13810537508

    game101       hu330602003[[[hu330602004[[[hu330602005[[[15967506560

     

    下面使用lateral_view

     

     

    hive> select game_id, user_id  

        > from test_lateral_view_shengli lateral view explode(split(userl_ids,'\\[\\[\\[')) snTable as user_id 

        > ;

    Total MapReduce jobs = 1

    Launching Job 1 out of 1

    Number of reduce tasks is set to 0 since there's no reduce operator

    Starting Job = job_201403301416_445839, Tracking URL = http://10.1.9.10:50030/jobdetails.jsp?jobid=job_201403301416_445839

    Kill Command = /app/home/hadoop/src/hadoop-0.20.2-cdh3u5/bin/../bin/hadoop job  -Dmapred.job.tracker=10.1.9.10:9001 -kill job_201403301416_445839

    2014-05-16 17:39:19,108 Stage-1 map = 0%,  reduce = 0%

    2014-05-16 17:39:28,157 Stage-1 map = 100%,  reduce = 0%

    2014-05-16 17:39:38,830 Stage-1 map = 100%,  reduce = 100%

    Ended Job = job_201403301416_445839

    OK

    game101       hu330602003

    game101       hu330602004

    game101       hu330602005

    game101       15967506560

    game101       15358083654

    game101       ab33787873

    game101       zjy18052480603

    game101       shlg1881826

    game101       lxqab110

    game66       winning1ren

    game66       13810537508

     

     

    2.2 多个Lateral View

    From语句后可以跟多个Lateral View。

    A FROM clause can have multiple LATERAL VIEW clauses. Subsequent LATERAL VIEWS can reference columns from any of the tables appearing to the left of the LATERAL VIEW.

    给定数据:

    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"

    我们可以这样写:

    SELECT myCol1, myCol2 FROM baseTable

    LATERAL VIEW explode(col1) myTable1 AS myCol1

    LATERAL VIEW explode(col2) myTable2 AS myCol2;

     

    3. Outer Lateral View

    还有一种情况,如果UDTF转换的Array是空的怎么办呢?

    在Hive0.12里面会支持outer关键字,如果UDTF的结果是空,默认会被忽略输出。

    如果加上outer关键字,则会像left outer join 一样,还是会输出select出的列,而UDTF的输出结果是NULL。

    hive> select * FROM test_lateral_view_shengli LATERAL VIEW explode(array()) C AS a ;

    结果是什么都不输出。

     

    如果加上outer关键字:

    SELECT * FROM src LATERAL VIEW OUTER explode(array()) C AS a limit 10;

     

    238 val_238 NULL

    86 val_86 NULL

    311 val_311 NULL

    27 val_27 NULL

    165 val_165 NULL

    409 val_409 NULL

    255 val_255 NULL

    278 val_278 NULL

    98 val_98 NULL

    ...

     

    4.总结:

     

    Lateral View通常和UDTF一起出现,为了解决UDTF不允许在select字段的问题。

    Multiple Lateral View可以实现类似笛卡尔乘积。

    Outer关键字可以把不输出的UDTF的空结果,输出成NULL,防止丢失数据。

     

    原创文章,转载请注明出自:http://blog.csdn.net/oopsoom/article/details/26001307

    展开全文
  • Lateral View是Hive中提供给UDTF的conjunction,它可以解决UDTF不能添加额外的select列的问题。1. Why we need Lateral View?当我们想对hive表中某一列进行split之后,想对其转换成1 to N的模式,即一行转多列。...
  • hive中的lateral view 用法详解上篇

    千次阅读 2016-05-17 11:16:18
    lateral view首先为原始表的每行调用UDTF,UDTF会把一行拆分成一或者多行,lateral view再把结果组合,产生一个支持别名表的虚拟表。 通过Lateral view可以方便的将UDTF得到的行转列的结果集合在一起提
  • Lateral View 语法描述横向视图与用户定义的表生成函数(如explode())结合使用。 如内置表生成函数中所述,UDTF为每个输入行生成零个或多个输出行。 横向视图首先将UDTF应用于基表的每一行,然后将结果输出行连接到...
  • 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
  • Lateral View和表生成函数(例如Split、Explode...lateralView: LATERAL VIEW [OUTER] udtf(expression) tableAlias AS columnAlias (',' columnAlias) * fromClause: FROM baseTable (lateralView)* Lateral view ou
  • 这篇文章讲的特别好 lateral view explode相当于笛卡尔乘积: 表1的每一行与表二的每一行组合,作为新的一行
  • hive行转列lateral view explode用法

    千次阅读 2017-03-21 16:14:58
    lateral view用于和split, explode等UDTF一起使用,它能够将一行数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。 工具/原料 HADOOP、HIVE HIVE、CRT 方法/步骤 先把要转换的...
  • Lateral View和Explode用法简介

    千次阅读 2019-04-10 15:25:16
    一、Explode用法 hive wiki对于expolde的解释如下: explode() takes in an array (or a map) as an input and outputs the elements of the array (map) as separate rows. UDTFs can be used in the SELECT ...
  • 用法LATERAL VIEW udtf(expression) tableAlias AS columnAlias 解释:用于和 split, explode 等 UDTF 一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。 lateral view 使用案例:...
  • 花2分钟理解hive的Lateral View + explode用法 explode为表生成函数: 作用 : 把map集合或数组array展开,其中每个键值对或数组中的每个元素都单独生成一行。 explode(array_or_map)就是内置表生成函数(UDTF),...
  • 有时候我们在处理数据时,会遇到某个列存在多值的情况,如果想拿到里面的每个值进行后续的处理的话,这种情况下有两种处理方式,如果是固定数目的多值,可以使用split切分,...hive行转列lateral view explode用法

空空如也

空空如也

1 2 3 4
收藏数 70
精华内容 28
关键字:

lateralview用法