Hadoop 蜂巢相当于第一个和最后一个

Hadoop 蜂巢相当于第一个和最后一个,hadoop,hive,sas,hiveql,Hadoop,Hive,Sas,Hiveql,我有一个包含3列的表: table1: ID, CODE, RESULT, RESULT2, RESULT3 我有这个SAS代码: data table1 set table1; BY ID, CODE; IF FIRST.CODE and RESULT='A' THEN OUTPUT; ELSE IF LAST.CODE and RESULT NE 'A' THEN OUTPUT; RUN; 因此,我们按ID和代码对数据进行分组,然后在满足某些条件时写入数据集。我想

我有一个包含3列的表:

table1: ID, CODE, RESULT, RESULT2, RESULT3
我有这个SAS代码:

data table1
   set table1;
   BY ID, CODE;
   IF FIRST.CODE and RESULT='A' THEN OUTPUT;
   ELSE IF LAST.CODE and RESULT NE 'A' THEN OUTPUT;
RUN;
因此,我们按ID和代码对数据进行分组,然后在满足某些条件时写入数据集。我想写一个配置单元查询来复制它。这就是我所拥有的:

proc sql;
   create table temp as
   select *, row_number() over (partition by ID, CODE) as rowNum
   from table1;

   create table temp2 as
   select a.ID, a.CODE, a.RESULT, a.RESULT2, a.RESULT3
   from temp a
   inner join (select ID, CODE, max(rowNum) as maxRowNum
               from temp
               group by ID, CODE) b
     on a.ID=b.ID and a.CODE=b.CODE
   where (a.rowNum=1 and a.RESULT='A') or (a.rowNum=b.maxRowNum and a.RESULT NE 'A');
quit;
我认为这有两个问题

1) 每个BY组中的第一行或最后一行完全取决于SAS中表1中的行顺序,我们不按任何顺序排序。我认为在转换为配置单元查询时不会保留行顺序

2) SAS代码按组或最后一行,而不是两行都取第一行。我认为我的配置单元查询同时采用了这两种方式,结果产生了比我想要的更多的行

如果您对如何改进我的查询有任何建议或见解,我们将不胜感激。甚至可以在配置单元中复制此SAS代码吗?

关于第1点)按组处理要求按变量对输入数据进行排序或索引,因此尽管代码不包含排序,但源数据是按顺序处理的。如果输入数据未编制索引/排序,SAS将抛出错误。 关于这一点,可能的差异出现在具有相同BY变量值的行上,尤其是在结果不同的情况下。 在SAS中,我会按ID、代码、结果对数据进行预排序,然后按ID代码使用,以避免受行顺序的影响

关于2)第一个和最后一个在SAS中都是正确的。因为你们的第一个和最后一个结果的条件是不同的,我想这不是差异的来源

我想您可以添加另一个字段作为

row_number() over (partition by ID, CODE desc) as rowNumDesc
检测rowNumDesc=1的最后一行(以便跳过联接)

编辑:

我认为上面的两个程序都包括随机选择ID和代码变量值相同的组的行,尤其是结果值相同的组。但是您应该从这两个行中获得相同数量的行。如果没有,就调试它


但是,SAS代码/存储中的随机性是基于行的物理顺序,而组中的行号随机性将受到引擎中功能实现的影响。

SAS代码有一个
by
语句(
by ID code;
),它告诉SAS,
集合
数据集按这些级别排序。因此,不要随机选择
第一个。
最后一个。

也就是说,我们可以通过使用
first\u value
last\u value
窗口函数在HIVE中复制这一点

首先。code
应复制到

first_value(code) over (partition by Id order by code)fcode
类似地,
LAST.code

last_value(code) over (partition by Id order by code)lcode
一旦有了
fcode
lcode
列,请使用
结果
列条件的case when语句。像

case when (code=fcode and result='A') or (code=lcode and result<>'A')
then 1 else 0 end as op_flag

既然SAS代码在OP中,那么有可能在hive或sql中复制它吗?因为如果出现平局,我认为SAS将选择组中的文字“last”行,而在hive/sql中,它可能是随机选择的@Vasja在hive中有一个
first_value()
last_value()
函数,在使用
groupby
时,字符串也有
min()
max()
select id, code, result from (
select *,
first_value(code) over (partition by id order by code)fcode,
last_value(code) over (partition by id order by code)lcode
from footab) f
where (code=fcode and result='A') or (code=lcode and result<>'A')