我在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);
但它没有用,有人有任何想法吗?
答案 0 :(得分:0)
array
是保留字,应该是合格的。<强>演示强>
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