我有以下数据集。我正在尝试将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
2条答案
按热度按时间dy2hfwbg1#
使用
Str_B_Class
作为索引str\u生成的Map到\uMap的参数:祝你今天愉快:)
vd2z7a6w2#
在Hive里,
explode
是可以为一行生成多行的udtf。而对于您的案例,需要一对一的关系。