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,现在我看不出如何将其转换为查询中的地图,希望您明白了。
另请参阅有关多个横向视图的信息:,但我相信这不是您的情况,如果您不需要获取很多行,则完全可以不使用爆炸的横向视图。
我正在尝试使用以下方法从 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,现在我看不出如何将其转换为查询中的地图,希望您明白了。
另请参阅有关多个横向视图的信息: