1

我正在尝试使用以下方法从 Hive 中的 URL 中提取 URL Query 参数。

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'

我需要从 URL 中提取cid的值到同一行的新列中。但是,我重复了多行(可能是笛卡尔积?)例如,一行 CID 重复了 3-4 行。我是横向视图的新手,对我做错的任何帮助表示赞赏!

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

4

1 回答 1

0

横向视图 explode(map) 为每个键值对生成行。显式语法是:

LATERAL VIEW explode(str_to_map(parse_url(omni.full_url, 'QUERY'), '&', '=') ) p as key, value

这会为每个 key= value 生成行:

tag=cidxxx 
scope=openid
client_id=****** 
and so on...

第二个横向可以产生更多的行:对于来自第一个横向视图的每一行,它可能会产生行并且它可以是笛卡尔积。

如果您只需要从 URL 中将 cid 的值提取到同一行的新列中,那么您可以在不爆炸所有键值对的情况下执行此操作。如果您解析参数并转换为 map,请使用 map[key] 获取值并根据需要进行转换。

提取标签值:

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 ,但我相信这不是您的情况,如果您不需要获得很多行,您完全可以不用带爆炸的横向视图。

于 2022-01-25T10:44:37.610 回答