【问题标题】:Can we create several entries from one line?我们可以从一行创建多个条目吗?
【发布时间】:2019-09-27 01:51:25
【问题描述】:

我的日志如下所示: client_id;event_1;event_2;event3

我想得到一个这样的 SQL 表:

 client_id |   event
 ---------------------
    ...    |  event_1
    ...    |  event_2
    ...    |  event_3

我是 Hive 的新手,在我看来,一条日志行总是在生成的 SQL 表中提供一个条目。 我尝试了以下(不成功):

CREATE EXTERNAL TABLE IF NOT EXISTS tablename (
         client_id String,
         `event` String
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
         "input.regex" = "^([^\;]+);.*([^\;]+).*$" )
LOCATION 's3://myBucket/prefix/';

它只需要第一个事件,而忽略其他事件......

【问题讨论】:

    标签: hive amazon-athena hive-serde regexserde presto


    【解决方案1】:

    很遗憾,无法在表 DDL 中使用 SerDe 生成行。在 Hive 中也可以这样做。

    (1) 将所有用户事件作为一列读取:

    CREATE EXTERNAL TABLE IF NOT EXISTS tablename (
             client_id String,
             events    String
    )
    ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
    WITH SERDEPROPERTIES (
     "input.regex" = "^([^\\;]+)\\;(.*)$" )
    LOCATION 's3://myBucket/prefix/';
    

    检查,它应该读取两列,user_id 和所有连接的事件:

    'client_id''event_1;event_2;event3'

    (2)拆分事件并分解生成行:

     select t.user_id, e.event
       from tablename t
            lateral view outer explode(split(t.events,'\\;')) e as event;
    

    另请阅读Lateral View

    在 Athena 中使用 UNNEST with CROSS JOIN:

    select t.user_id, e.event
           from tablename t
           CROSS JOIN UNNEST(SPLIT(t.events,';')) AS e (event)
    

    【讨论】:

    • 受到这样的限制真是令人失望!这似乎是一个很好的解决方案,不幸的是我使用的是不支持这种类型查询的 AWS Athena(获取Queries of this type are not supported [...])。你回答了这个问题,我只是在等待任何其他贡献才接受它:)
    • @Sinn 在 Athena 中使用 UNNEST 而不是横向视图:docs.aws.amazon.com/athena/latest/ug/flattening-arrays.html
    • 非常感谢,它适用于UNNEST。你很有帮助,我只是有点失望,拆分是由请求完成的,而不是直接在表格中......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    • 2018-12-02
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多