我正在尝试使用下面的方法从Hive中的URL中提取URL查询参数。
SELECT split(cid.key, '%3d') [1] AS connectionID
FROM omni
LATERAL VIEW explode(str_to_map(parse_url(omni.full_url, 'QUERY'), '&', '=') ) queryparams
LATERAL VIEW explode(str_to_map(queryparams.value, '%2')) cid
WHERE queryparams.key = 'tag'
AND split(cid.key, '%3d') [0] = 'cid'我需要从提取的值到同一行的新列中。然而,我得到了多行重复(可能是得到笛卡尔乘积?)例如,对3-4行重复一行CID。我是新的横向观点,任何帮助我所做的错误是感谢!
URL模式如下所示:
https://www.***********ize?response_type=id_token&client_id=******&redirect_uri=*******l/in/228467e4-d9b6-4b04-8a11-45e1cc9f786d&scope=openid&code_challenge=E9M***********JSstw-cM&code_challenge_method=S256&tag=cid%3***********8-e94f97d20ab9%2caid%3d************a-4fb1-b6e5-c65650428a83&state=aHR*****************Z2luT3JSZWdpc3Rlcg%3d%3d#features_section
发布于 2022-01-25 10:44:37
横向视图爆炸(Map)为每个键值对生成行。显式语法是:
LATERAL VIEW explode(str_to_map(parse_url(omni.full_url, 'QUERY'), '&', '=') ) p as key, value这将为每个key=值生成行:
tag=cidxxx
scope=openid
client_id=******
and so on...第二,横向可以产生更多的行:对于第一横向视图中的每一行,它可能会生成行,并且它可以是笛卡尔积。
如果您只需要从URL中提取cid的值到同一行的一个新列中,那么您就可以做到这一点,而不需要爆炸所有的键值对。如果您解析了参数并将其转换为map,则使用mapkey获取值并根据需要对其进行转换。
提取标签值:
SELECT str_to_map(parse_url(omni.full_url, 'QUERY'), '&', '=')['tag']
FROM omni对于您的URL示例,它生成:
'cid%3***********8-e94f97d20ab9%2caid%3d************a-4fb1-b6e5-c65650428a83'您可以转换值并从中提取所需的一切。
split(str_to_map(parse_url(omni.full_url, 'QUERY'), '&', '=')['tag'],'%3')[1]
会回来
'***********8-e94f97d20ab9%2caid%3d************a-4fb1-b6e5-c65650428a83'
等等..。
至少,如果没有第二次横向观察的话,你肯定可以做到这一点。
您混淆的URL,现在我不知道如何可以转换成地图,如在您的查询,希望您有这个想法。
还请参阅多个横向视图:https://stackoverflow.com/a/69735508/2700344,但我相信这不是您的情况,如果您不需要获得很多行,则完全可以不使用侧视图而使用need。
https://stackoverflow.com/questions/70846057
复制相似问题