在HIVE中提取数组的最后两个元素

时间:2017-09-04 22:21:33

标签: arrays hive

我在hive表中有一个数组,我想提取每个数组的最后两个元素,如下所示: [" a"," b"," c"] - > [" b"," c"]

我尝试了这样的代码:

SELECT
 *,
 array[size]     AS term_n,
 array[size - 1] AS term_n_1
FROM
(SELECT *, size(array) AS size FROM MyTable);

但它没有用,有人有任何想法吗?

3 个答案:

答案 0 :(得分:0)

  1. array是保留字,应该是合格的。
  2. 内部子查询应该是别名。
  3. 数组索引从0开始。如果数组大小为5,则最后一个索引为4.
  4. <强>演示

    with MyTable as (select array('A','B','C','D','E') as `array`)
    
    SELECT  *
           ,`array`[size - 1] AS term_n
           ,`array`[size - 2] AS term_n_1
    
    FROM   (SELECT *
                   ,size(`array`)   AS size 
    
            FROM    MyTable
            ) t
    ;
    
    +-----------------------+--------+--------+----------+
    |        t.array        | t.size | term_n | term_n_1 |
    +-----------------------+--------+--------+----------+
    | ["A","B","C","D","E"] |      5 | E      | D        |
    +-----------------------+--------+--------+----------+
    

答案 1 :(得分:0)

这是一种在同一查询中提取数组的最后一个元素的解决方案(请注意,它不是最佳选择,您可以应用相同的原理来提取数组的n个最后一个元素),逻辑是计算最后一个元素的大小(字母的数量减去分隔符),然后使子字符串从0到总大小减去所计算的要提取的字符数量

示例表:

col1  |   col2
--------------
row1  |   aaa-bbb-ccc-ddd

您要获取(提取最后一个元素,在这种情况下为“ -ddd”):

row1  |   aaa-bbb-ccc

您可能需要的查询:

select col1, substr(col2,0,length(col2)-(length(reverse(split(reverse(col2),'-')[0]))+1)) as shorted_col2_1element from example_table

如果要添加更多元素,则必须继续在操作的第二部分中添加位置。

提取最后2个元素的示例:

select col1, substr(col2,0,length(col2)-(length(reverse(split(reverse(col2),'-')[0]))+1) + length(reverse(split(reverse(col2),'-')[1]))+1)) as shorted_col2_2element from example_table

执行第二个命令行后,您将看到类似以下内容的内容: 第1行| aaa-bbb

* 如前所述,这根本不是最佳解决方案,但可能会对您有所帮助

答案 2 :(得分:-1)

我不知道你得到的错误,但它应该像

select
yourarray[size(yourarray)],
yourarray[size(yourarray)-1]
from mytable