Hive 如何识别配置单元中重复出现的字符串列?

Hive 如何识别配置单元中重复出现的字符串列?,hive,pyspark,hiveql,pyspark-sql,sparkr,Hive,Pyspark,Hiveql,Pyspark Sql,Sparkr,我在蜂巢中看到的是这样的景象: id sequencenumber appname 242539622 1 A 242539622 2 A 242539622 3 A 242539622 4 B 242539622 5 B 242539622

我在蜂巢中看到的是这样的景象:

id        sequencenumber          appname
242539622              1          A
242539622              2          A
242539622              3          A
242539622              4          B
242539622              5          B
242539622              6          C
242539622              7          D
242539622              8          D
242539622              9          D
242539622             10          B
242539622             11          B
242539622             12          D
242539622             13          D
242539622             14          F 
我希望每个id都有以下视图:

id        sequencenumber          appname    appname_c
242539622              1          A             A
242539622              2          A             A
242539622              3          A             A
242539622              4          B             B_1
242539622              5          B             B_1
242539622              6          C             C
242539622              7          D             D_1
242539622              8          D             D_1
242539622              9          D             D_1
242539622             10          B             B_2
242539622             11          B             B_2
242539622             12          D             D_2
242539622             13          D             D_2
242539622             14          F             F 
或者任何与此类似的,可以识别序列中给定事件的再次发生

我的最终目标是计算每一组事件(或状态,如果您愿意,在马尔可夫建模的上下文中)所花费的时间,并考虑是否存在任何循环。例如,在上面的示例中,在B_1中花费的时间可以与B_2进行非常好的比较


我们已经在Hive()中搜索了窗口函数,但我认为它们无法像R/Python那样进行行比较。

您需要执行两个窗口函数才能获得该结果

使用pyspark并假设
df
是您的数据帧:

from pyspark.sql import functions as F, Window

df.withColumn(
    "fg",
    F.lag("appname").over(Window.partitionBy("id").orderBy("sequencenumber)
).withColumn(
    "fg",
    F.when(
        F.col("fg")==F.col("id"),
        0
    ).otherwise(1)
).withColumn(
    "fg",
    F.sum("fg").over(Window.partitionBy("id", "appname"))
).show()

使用配置单元窗口函数的解决方案。我使用了您的数据来测试它,删除
您的\u表
CTE并使用您的表。结果如预期

with your_table as (--remove this CTE, use your table instead
select stack(14,
'242539622', 1,'A',
'242539622', 2,'A',
'242539622', 3,'A',
'242539622', 4,'B',
'242539622', 5,'B',
'242539622', 6,'C',
'242539622', 7,'D',
'242539622', 8,'D',
'242539622', 9,'D',
'242539622',10,'B',
'242539622',11,'B',
'242539622',12,'D',
'242539622',13,'D',
'242539622',14,'F'
) as (id,sequencenumber,appname)
) --remove this CTE, use your table instead

select id,sequencenumber,appname, 
       case when sum(new_grp_flag) over(partition by id, group_name) = 1 then appname --only one group of consequent runs exists (like A)
            else        
            nvl(concat(group_name, '_', 
                       sum(new_grp_flag) over(partition by id, group_name order by sequencenumber) --rolling sum of new_group_flag
                       ),appname) 
        end appname_c       
from
(       

select id,sequencenumber,appname,
       case when appname=prev_appname or appname=next_appname then appname end group_name, --identify group of the same app
       case when appname<>prev_appname or prev_appname is null then 1 end new_grp_flag     --one 1 per each group
from       
(
select id,sequencenumber,appname,
       lag(appname)  over(partition by id order by sequencenumber) prev_appname, --need these columns
       lead(appname) over(partition by id order by sequencenumber) next_appname  --to identify groups of records w same app
from your_table --replace with your table
)s
)s
order by id,sequencenumber
;

谢谢史蒂文,但这并没有产生预期的结果。谢谢@leftjoin这正是我想要的。
OK
id        sequencenumber     appname    appname_c
242539622       1       A       A
242539622       2       A       A
242539622       3       A       A
242539622       4       B       B_1
242539622       5       B       B_1
242539622       6       C       C
242539622       7       D       D_1
242539622       8       D       D_1
242539622       9       D       D_1
242539622       10      B       B_2
242539622       11      B       B_2
242539622       12      D       D_2
242539622       13      D       D_2
242539622       14      F       F
Time taken: 232.319 seconds, Fetched: 14 row(s)