Hive 配置单元-选择另一个字段的值在连续时间戳中递增的id

Hive 配置单元-选择另一个字段的值在连续时间戳中递增的id,hive,timestamp,bigdata,Hive,Timestamp,Bigdata,我需要从下面的配置单元表“是否报告”中选择设备id,该设备id的读数在连续时间戳中递增 station_id equipment_id timpe_stamp Reading 1 100 00:00:01 60 2 100 00:00:02 61 3 100 00:00:03 62 4 100 00:00:04

我需要从下面的配置单元表“是否报告”中选择设备id,该设备id的读数在连续时间戳中递增

station_id  equipment_id timpe_stamp Reading
 1              100       00:00:01    60
 2              100       00:00:02    61
 3              100       00:00:03    62
 4              100       00:00:04    60
 5              100       00:00:05    61
 .               .            .        .
 .               .            .        .
 16             114       00:00:11    66
 17             114       00:00:12    65
 .               .            .        .
 .               .            .        .
 .               .            .        .
 .               .            .        .
 29              112       00:00:23    71
 30              113       00:00:24    69

例如:-我需要选择设备id,其读数在五个连续的时间戳中以升序显示,例如:-60->61->62->63->64->65,并且不应选择后续时间戳中读数的设备id,例如:-60->61->62->60->61。我正在努力获得正确的查询。非常感谢您的任何建议。

您可能需要去找pig或MR。您正试图在一组读数中找到长度为5的排序子序列,这可能无法在单个查询中实现。

您可能需要转到pig或MR。您正在尝试在一组读数中找到长度为5的排序子序列,这可能无法在单个查询中实现。

我尝试了一个循环来满足您的要求:

     List<Integer> lis = new ArrayList<Integer>();
     int j=0, flag=1, width=0;

     lis.add(0, 60);
     lis.add(1, 61);
     lis.add(2, 61);
     lis.add(3, 60);
     lis.add(4, 61);
     lis.add(5, 62);
     lis.add(6, 64);
     lis.add(7, 66);
     lis.add(8, 68);



       Iterable<Integer> itr = lis;

       for(int i : itr)
       {
           if( j != 0) {

               if( width == 4)
                   break;

               if( i>j ) {
                   flag = 1;
                   width++;
               }
               else if( i<j && width != 4) {
                   flag = 0;
                   width = 0;
               }
           }

           System.out.println(i);
           j=i;
       }

       System.out.println("flag = "+flag+"width = "+ (width));

}
输出: 60 61 61 60 61 62 64 66 标志=1宽度=4

我认为如果可以将其插入reducer类中,其中键为IntWritable equipment_id,值为Iterable IntWritable values,并将值提供给该循环,假设所有时间戳值都是唯一的。
考虑到数据量,不知道这是否是最佳解决方案。希望能有帮助

我尝试了一个循环来满足您的要求:

     List<Integer> lis = new ArrayList<Integer>();
     int j=0, flag=1, width=0;

     lis.add(0, 60);
     lis.add(1, 61);
     lis.add(2, 61);
     lis.add(3, 60);
     lis.add(4, 61);
     lis.add(5, 62);
     lis.add(6, 64);
     lis.add(7, 66);
     lis.add(8, 68);



       Iterable<Integer> itr = lis;

       for(int i : itr)
       {
           if( j != 0) {

               if( width == 4)
                   break;

               if( i>j ) {
                   flag = 1;
                   width++;
               }
               else if( i<j && width != 4) {
                   flag = 0;
                   width = 0;
               }
           }

           System.out.println(i);
           j=i;
       }

       System.out.println("flag = "+flag+"width = "+ (width));

}
输出: 60 61 61 60 61 62 64 66 标志=1宽度=4

我认为如果可以将其插入reducer类中,其中键为IntWritable equipment_id,值为Iterable IntWritable values,并将值提供给该循环,假设所有时间戳值都是唯一的。
考虑到数据量,不知道这是否是最佳解决方案。希望能有帮助

这并不能回答问题。花些时间编辑你的答案。这并不能回答问题。花些时间在上面,然后编辑你的答案。