列和返回结果之间的sql字符串匹配

hfwmuf9z  于 2021-06-25  发布在  Hive
关注(0)|答案(2)|浏览(317)

我有以下数据集。我正在尝试将col=“str\u b\u class”中的字符串与col=“str\u a”中的整个字符串匹配。stru\a col的数据如下class:value. 如果在str\u a中找到该类,则sql应将冒号后面的值放入所需的\u output\u列,否则为0
下面代码的问题是,如果它的let表示找到了3132,并且值为10,那么如果返回一行3132是匹配的,那么它将返回6次。所以它正在爆炸整个数据集。我需要一些帮助来匹配字符串而不破坏整个table。

Customer_ID ||                   Str_A                     || Str_B_Class || Desired_Output
-------------------------------------------------------------------------------------------    
    A1      || 121:8|188:8|3123:10|3125:10|3131:10|3132:10 || 3132        || 10
    A1      || 121:8|188:8|3123:10|3125:10|3131:10|3132:10 || 3125        || 10
    A1      || 121:8|188:8|3123:10|3125:10|3131:10|3132:10 || 4141        || 0

查询:

select 
    s.Customer_Id, 
    s.Str_A,  
    s.Str_B_Class, 
    case when s.instance_id = s.Str_B_Class 
        then s.Count_of_instances 
        else '0' 
    end AS Desired_Output 
from ( 
    select 
        Customer_Id, Str_A,  
        Str_B_Class, 
        explode(str_to_map(Str_A,'[|]','[:]')) as (instance_id, Count_of_instances) 
    from my_table 
) as s
dy2hfwbg

dy2hfwbg1#

使用 Str_B_Class 作为索引str\u生成的Map到\uMap的参数:

SELECT
    Customer_Id, Str_A, Str_B_Class, 
    NVL(STR_TO_MAP(Str_A,'[|]','[:]')[Str_B_Class], '0') as Desired_Output 
FROM my_table

祝你今天愉快:)

vd2z7a6w

vd2z7a6w2#

在Hive里, explode 是可以为一行生成多行的udtf。而对于您的案例,需要一对一的关系。

相关问题