【问题标题】:How to compare two tuples in PIG?如何比较 PIG 中的两个元组?
【发布时间】:2016-03-02 16:47:15
【问题描述】:

我想过滤数据集A的飞行延迟时间小于某些特定值(x)的记录。

但是我会从另一个 pig 查询中得到 x 的值,它是一个元组,因为 x 是一个元组。

但是使用下面的语句会报错:

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

文件A中的数据如下;

ravi,savings,avinash,2,char,33,F,22,44,12,13,33,44,22,11,10,22,26 avinash,current,sandeep,3,char,44,M,33,11,10,12,33,22,39,12,23,19,35 supreeth,储蓄,prabhash,4,char,55,F,22,12,23,12,44,56,7,88,34,23,68 lavi,current,nirmesh,5,char,33,M,11,10,33,34,56,78,54,23,445,66,77 Venkat,savings,bunny,6,char,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;

【问题讨论】:

  • x 会有 1 个值吗?你试过 FLATTEN(x);
  • 是的 x 将只有价值,我已经尝试过 FLATTEN(x) 但除了使用过滤器之外,它没有任何其他方式来过滤这些记录?
  • 您可以发布示例数据吗?
  • 是的.....我现在已经在问题中更新了它。
  • 请检查由x表示的关系是否包含关系B中的值即40。可能会发生关系B无法获取x的值

标签: hadoop mapreduce hive apache-pig hdfs


【解决方案1】:

解决办法如下:

输入

我们有两个输入文件:

  1. airlinesdata.txt - 拥有原始数据 ravi,savings,avinash,2,char,33,F,22,44,12,13,33,44,22,11,10,22,26 avinash,current,sandeep,3,char,44,M,33,11,10,12,33,22,39,12,23,19,35 supreeth,储蓄,prabhash,4,char,55,F,22,12,23,12,44,56,7,88,34,23,68 lavi,current,nirmesh,5,char,33,M,11,10,33,34,56,78,54,23,445,66,77 Venkat,savings,bunny,6,char,11,F,99,12,34,55,33,23,45,66,23,23,28

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

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

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

rawdata = LOAD 'airlinesdata.txt' USING PigStorage(',') AS (field1:chararray,field2:chararray,field3:chararray,field4:chararray,field5:chararray,field6:chararray,field7:chararray,field8: chararray,field9:chararray,field10:chararray,field11:chararray,field12:chararray,field13:chararray,field14:chararray,field15:chararray,field16:chararray,field17:chararray,flight_delay_time:int);

x_data = LOAD 'x.txt' USING 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);

最后我们可以发出过滤查询来得到结果。 请注意如何在下面使用 .来自 max_value_casted 关系的运算符。

output_data = FILTER rawdata BY flight_delay_time

转储输出数据;

OUTOUT - 值小于 X (40) 的最大值

(ravi,savings,avinash,2,char,33,F,22,44,12,13,33,44,22,11,10,22,26) (avinash,current,sandeep,3,char,44,M,33,11,10,12,33,22,39,12,23,19,35) (Venkat,savings,bunny,6,char,11,F,99,12,34,55,33,23,45,66,23,23,28)

希望对你有帮助:)

【讨论】:

    猜你喜欢
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 2016-06-19
    • 1970-01-01
    • 2011-01-13
    • 2021-08-08
    • 1970-01-01
    相关资源
    最近更新 更多