选择 hive 中的下一个非空字段

Posted

技术标签:

【中文标题】选择 hive 中的下一个非空字段【英文标题】:Select the next non empty field in hive 【发布时间】:2017-05-24 06:50:57 【问题描述】:

我有一个包含 6 个字段的表格,如下所示:

Field1 Field2 Field3 Field4 Field5 Field6
ABC    45     XYZ           JKL    BNM
       65            QWE    JKL    
WER           YUI    IOP    GHJ

我想将数据从上面的表中提取到一个新表中,其中包含 5 个字段,我们忽略了空值。我的决赛桌应该是这样的:

Result1 Result2 Result3 Result4 Result5
ABC     45      XYZ     JKL     BNM
65      QWE     JKL
WER     YUI     IOP     GHJ

我已经开始使用 CASE WHEN 编写大量条件查询,但它已经失控并且容易出错。 是否可以在 Hive 中使用 regex_extract 查询来获取该表?

【问题讨论】:

我不知道 Hive SQL(或 Hive),但如果您最终遇到这种情况,我可能会质疑您的设计。您是如何得出如此稀疏的数据的? 如果从查询的 select 语句中删除空列数据,则很有可能损坏数据。就像在您给 JKL 的示例中一样,是 Inut 数据中 Field5 列的值,但是在输出中您需要 JKL 到 Result4 列的值。 “空值”是指空字符串还是 NULL? 空字符串 - where field = "" 数据稍后需要适应另一个布局。如果由我决定,我会连接所有内容。 【参考方案1】:

假设“空值”是 Nulls

select  fields[0]   as Field1
       ,fields[1]   as Field2
       ,fields[2]   as Field3
       ,fields[3]   as Field4
       ,fields[4]   as Field5

from   (select  split(concat_ws(string(unhex(1)),*),'\\x01') as fields
        from    mytable
        ) t

+--------+--------+--------+--------+--------+
| field1 | field2 | field3 | field4 | field5 |
+--------+--------+--------+--------+--------+
| ABC    | 45     | XYZ    | JKL    | BNM    |
| 65     | QWE    | JKL    | (null) | (null) |
| WER    | YUI    | IOP    | GHJ    | (null) |
+--------+--------+--------+--------+--------+

简化版,假设您的字段中没有出现逗号 (,):

select  ...

from   (select  split(concat_ws(',',*),',') as fields
        from    mytable
        ) t

假设“空值”是空字符串

select  fields[0]   as Field1
       ,fields[1]   as Field2
       ,fields[2]   as Field3
       ,fields[3]   as Field4
       ,fields[4]   as Field5

from   (select  split(regexp_replace(concat_ws(string(unhex(1)),*),'^\\x01+|\\x01+$|(\\x01)+','$1'),'\\x01') as fields
        from    mytable
        ) t

+--------+--------+--------+--------+--------+
| field1 | field2 | field3 | field4 | field5 |
+--------+--------+--------+--------+--------+
| ABC    | 45     | XYZ    | JKL    | BNM    |
| 65     | QWE    | JKL    | (null) | (null) |
| WER    | YUI    | IOP    | GHJ    | (null) |
+--------+--------+--------+--------+--------+

简化版,假设您的字段中没有出现逗号 (,):

select  ...

from   (select  split(regexp_replace(concat_ws(',',*),'^,+|,+$|(,)+','$1'),',') as fields
        from    mytable
        ) t

【讨论】:

以上是关于选择 hive 中的下一个非空字段的主要内容,如果未能解决你的问题,请参考以下文章

从大表中选择非空字段

数据库:选择最后一个非空条目

数据库:选择最后一个非空条目

列表“icons”中的每个字典都应该包含一个非空的 UTF8 字符串字段“type”

在 AWS Athena 中查询第一个非空值的动态 JSON 字段

指定为非空的参数为空:无法更新 Spring Boot jpa 中的单个实体字段。导致指定为非空的参数为空