如何比较PIG中的两个元组?

时间:2016-03-02 16:47:15

标签: hadoop mapreduce hive apache-pig hdfs

我想过滤其flight_delay_time小于某些特定值(x)的数据集A的记录。

但是我会从另一个猪查询得到x的值,这是一个元组,在某种意义上x是一个元组。

但是使用以下语句会引发错误:

B = FILTER A by flight_delay_time < x;
dump B;

文件A中的数据采用以下方式;

拉​​维,储蓄,阿维纳什,2,炭,33,F,22,44,12,13,33,44,22,11,10,22,26 阿维纳什,电流,和Sandeep,3,炭,44,男,33,11,10,12,33,22,39,12,23,19,35 supreeth,储蓄,prabhash,4,炭,55,F,22,12,23,12,44,56,7,88,34,23,68 LAVI,电流,nirmesh,5,炭,33,M 11,10,33,34,56,78,54,23,445,66,77 Venkat,储蓄,兔子,6,炭,11,F,99,12,34,55,33,23,45,66,23,23,28

x =(40)的值,它存储为元组。

上述数据中的最后一列表示flight_delay_time。

我以下列方式提取X的值。

以下是存储在C_CONTROL_BATCH.txt

中的数据

25 35 40 15

我使用以下代码来提取X的值。

control_batch = LOAD 'C_CONTROL_BATCH.txt' AS (start:int);
variable = ORDER control_batch BY start DESC;
X = LIMIT starttime 1;

1 个答案:

答案 0 :(得分:1)

以下是解决方案:

<强> INPUT

我们有两个输入文件:

  1. airlinesdata.txt - 拥有rawdata 拉维,储蓄,阿维纳什,2,炭,33,F,22,44,12,13,33,44,22,11,10,22,26 阿维纳什,电流,和Sandeep,3,炭,44,男,33,11,10,12,33,22,39,12,23,19,35 supreeth,储蓄,prabhash,4,炭,55,F,22,12,23,12,44,56,7,88,34,23,68 LAVI,电流,nirmesh,5,炭,33,M 11,10,33,34,56,78,54,23,445,66,77 Venkat,储蓄,兔子,6,炭,11,F,99,12,34,55,33,23,45,66,23,23,28

  2. x.txt - 从我们获取x值的数据 - 20 三十 35 38 37 40 29

  3. flight_delay_time列是以下关系中的最后一列,类型为int。

    注意 - 如果你没有在这里声明它,程序会抛出一个异常,当你最后过滤时它无法从byterarray转换为int。

    rawdata = LOAD&#39; airlinesdata.txt&#39;使用PigStorage(&#39;,&#39;)AS(field1:chararray,field2:chararray,field3:chararray,field4:chararray,field5:chararray,field6:chararray,field7:chararray,field8:chararray,field9:chararray ,字段10:chararray,field11:chararray,field12:chararray,field13:chararray,field14:chararray,field15:chararray,field16:chararray,field17:chararray,flight_delay_time:INT);

    x_data = LOAD&#39; x.txt&#39;使用PigStorage()AS(x_val:int);

    order_x_data = ORDER x_data BY x_val desc;

    max_value = LIMIT order_x_data 1;

    这里我们再次将值转换为int,以使过滤条件起作用。

    max_value_casted = FOREACH max_value GENERATE $ 0 as(maxval:int);

    最后,我们可以发出过滤查询来获取结果。 注意如何使用下面的访问maxval。来自max_value_casted关系的运算符。

    output_data = FILTER rawdata BY flight_delay_time&lt; max_value_casted.maxval;

    DUMP output_data;

    OUTOUT - 小于X(40)

    的最大值的值

    (拉维,储蓄,阿维纳什,2,炭,33,F,22,44,12,13,33,44,22,11,10,22,26) (阿维纳什,电流,和Sandeep,3,炭,44,男,33,11,10,12,33,22,39,12,23,19,35) (Venkat,储蓄,兔子,6,炭,11,F,99,12,34,55,33,23,45,66,23,23,28)

    希望有所帮助:)