URL Hive 中的参数提取

URL Params extraction in Hive

我正在尝试使用以下方法从 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'

我需要将 cid 的值从 URL 提取到同一行的新列中。 但是,我重复多行(可能得到笛卡尔积?) 例如,一行 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

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

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

这会为每个键生成行=值:

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

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

如果您只需要将 URL 中的 cid 值提取到同一行的新列中,那么您可以在不分解所有 key-value 对的情况下完成。如果您解析参数并转换为 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]

将return

'***********8-e94f97d20ab9%2caid%3d************a-4fb1-b6e5-c65650428a83'

等等...

至少看起来你绝对可以没有第二个侧面视图,如果不是两者都没有的话。

您混淆了 URL,现在我看不出如何将其转换为查询中的地图,希望您明白了。

另请参阅有关多个横向视图的信息:,但我相信这不是您的情况,如果您不需要获取很多行,则完全可以不使用爆炸的横向视图。