Hive函数以检索特定的数组元素

时间:2018-10-25 08:03:29

标签: hadoop hive

我有一个表,该表将字符串存储在数组中。无法弄清楚为什么,但是一个简单的例子看起来像这样:

    dfTemp = pd.merge(df2, df3,  how='outer', on=['Year_Month','Client','Product','currency_str'])
    dfTemp = dfTemp.fillna(0)
    dfTemp['Total_RFQ'] = dfTemp['Done_RFQ'] + dfTemp['Not_Done_RFQ'] 
    dfTemp['Total_RFQ_Volume'] = (dfTemp['Done_RFQ_Volume']) + dfTemp['Not_Done_RFQ_Volume']
    df_Client_Product_Ccy_Hit_Rate_Volumes = pd.merge(dfTemp, df1,  how='inner', left_on=['Year_Month','Client'], right_on = ['Year_Month','Client'])

我们在上表中看不到,但是第一个字符串的真实格式如下所示 enter image description here

基本上,我想检索的是:

+--------+----------------------------------+
| reason |              string              |
+--------+----------------------------------+
| \N     | \N\N\N\NXXX - ABCDEFGH\N\N |
| \N     | \N\N\N\NXXX - ABCDEFGH       |
| \N     | \N\N\N\N                      |
| \N     | \N\N\N\NXXX - ABCDEFGH\N    |
| \N     | \N\N                            |
| \N     | \N\N\N                         |
| \N     | \N                               |
+--------+----------------------------------+

XXX-始终相同,但ABCDEFGH可以是任何字符串。 问题是我不能使用表path.path.path_path [4],因为字符串XXX-ABCDEFGH可能是第4个或数组的任何元素(甚至是20个)。

试图使用+--------+----------------------------------+ | reason | string | +--------+----------------------------------+ | \N | XXX - ABCDEFGH | +--------+----------------------------------+ 但收到错误

where lower(path.path.string) like ('xxx - %')

1 个答案:

答案 0 :(得分:1)

正则表达式将为您完成这项工作([^\N$])+

假定图像中显示的字符为$

第一,  您可以使用regexp_extract()来检索特定的数组元素。 它具有以下语法:

regexp_extract(string subject, string pattern, int index)

第二,您可以使用具有以下语法的regexp_replace

regexp_replace(string INITIAL_STRING, string PATTERN, string REPLACEMENT)

测试数据

WITH string_column 
     AS (SELECT explode(array('XXX - ABCSSSSSSSSSSSGH\N\N', 
                    '\N$\N$\N$\N$XXX - ABCDEFGH$\N\N', 
                    '\N\N\N\N', '\N\N\N\NXXX - ABCDEFGH\N')) AS 
            str_column
        ) 
SELECT regexp_replace(regexp_extract(str_column, '([^\N$])+', 0), "$", " ") 
    AS string_col 
FROM string_column 

会导致

------------------------------
|         string_col         |
------------------------------
| XXX - ABCSSSSSSSSSSSGH     |
------------------------------
| XXX - ABCDEFGH             |
------------------------------
|                            |
------------------------------
| XXX - ABCDEFGH             |
------------------------------

注意:在基于模式的提取之后,指定索引的'0'会产生匹配项。

regexp_extract(str_column, '(,|[^\N$])+', 0) 

以下语句将替换出现的任何“ $”

regexp_replace(regexp_extract(str_column, '([^\N$])+', 0), "$", " ")

有关的更多信息