add jar /path/to/jars/brickhouse-0.7.1.jar;
add jar /path/to/jars/hive_common-SNAPSHOT.jar;
create temporary function collect as "brickhouse.udf.collect.CollectUDAF";
create temporary function remove_dups as "something.RemoveSequentialDuplicatesUDF";
select screen_flow, count
, dense_rank() over (order by count desc) rank
from (
select screen_flow
, count(*) count
from (
select session_id
, concat_ws("->", remove_dups(screen_array)) screen_flow
from (
select session_id
, collect(screen_name) screen_array
from (
select *
from database.table
order by screen_launch_time ) a
group by session_id ) b
) c
group by screen_flow ) d
2条答案
按热度按时间kxxlusnw1#
输入
我找不到使用pig内置函数删除同一会话id的相邻屏幕的方法,因此我使用了javaudf来删除相邻的屏幕名称。
我创建了一个名为getorderedscreen的JavaUDF,将该udf合并到jar中,并将该jar命名为screenfilter.jar,并在这个pig脚本中注册了该jar
下面是getOrderedScreenJavaUDF的代码
}
输出
希望这对你有帮助!。。还要再等一段时间,一些看到这个问题的好头脑会有效地回答(没有javaudf)
6jygbczu2#
你可以参考这个问题,一个特工问了类似的问题。如果我正确地理解了您的问题,那么您希望从路径中删除重复项,但仅当它们彼此相邻时。所以呢
1 -> 1 -> 2 -> 1
会变成1 -> 2 -> 1
. 如果这是正确的,那么你不能只是分组和distinct
(我相信你已经注意到了)因为它会删除所有的副本。一个简单的解决方案是编写一个udf来删除那些重复项,同时保留用户的不同路径。自定义项:
要建造这个jar,你需要一个
hive-core.jar
以及hadoop-core.jar
,您可以在maven存储库中找到这些。确保您获得了在您的环境中使用的hive和hadoop版本。另外,如果您计划在生产环境中运行这个,我建议您向udf添加一些异常处理。构建jar之后,导入它并运行以下查询:查询:
输出:
希望这有帮助。