Apache pig apache清管器计数不工作,转储失败

Apache pig apache清管器计数不工作,转储失败,apache-pig,Apache Pig,我从类中分配了一个任务,以查找按特定条件筛选的条目数 我的问题如下我的数据集有以下模式 data1 = LOAD '/answers.csv' USING PigStorage(',') AS (qid:long,qt:long,tag:chararray,at:long); qid = question ID, qt = question start time(in epoch time), at = answer end time(in epoch time); 样本数据集: sn qi

我从类中分配了一个任务,以查找按特定条件筛选的条目数

我的问题如下我的数据集有以下模式

data1 = LOAD '/answers.csv' USING PigStorage(',') AS (qid:long,qt:long,tag:chararray,at:long);

qid = question ID, qt = question start time(in epoch time), at = answer end time(in epoch time);
样本数据集:

sn qid qt标签位于

1 563355 1235000081 php,错误,gd,图像处理1235000501

2 563355 1235000081 php,错误,gd,图像处理1235000551

3 563356 1235000140 lisp,scheme,主观,clojure 1235000177

4 563356 1235000140 lisp,scheme,主观,clojure 1235001545

5 563356 1235000140 lisp,scheme,主观,clojure 1235002457

6 563356 1235000140 lisp,scheme,主观,clojure 1235002809

7 563356 1235000140 lisp,scheme,主观,clojure 1235003266

8 563356 1235000140 lisp,scheme,主观,clojure 1235007817

9 563356 1235000140 lisp,scheme,主观,clojure 1235007913

10 563356 1235000140 lisp,scheme,主观,clojure 1235020626

11 563356 1235000140 lisp,scheme,主观,clojure 1235040652

需要在1小时内找到所回答问题的数量

方法:清管器版本0.15.0

找出qt和at之间的差异

A = FOREACH data1 GENERATE HoursBetween(ToDate(qt),ToDate(at)) AS diffhours;

B = FOREACH (FILTER A BY diffhours < 1) GENERATE diffhours;

C = GROUP B ALL;

D = FOREACH C GENERATE COUNT(B.diffhours) ;
A=FOREACH data1生成小时间隔(ToDate(qt)、ToDate(at))作为diffhours;
B=FOREACH(按diffhours<1过滤A)生成diffhours;
C=B组ALL;
D=每个C生成计数(B.D小时);
但当我转储D时,作业失败,并给出以下注释:

2016-04-06 01:13:17,736 [LocalJobRunner Map Task Executor #0] WARN  org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigHadoopLogger - org.apache.pig.builtin.Utf8StorageConverter(FIELD_DISCARDED_TYPE_CONVERSION_FAILED): Unable to interpret value [112, 114, 111, 103, 114, 97, 109, 109, 105, 110, 103] in field being converted to int, caught NumberFormatException <For input string: "programming"> field discarded
2016-04-06 01:13:17,736 [LocalJobRunner Map Task Executor #0] WARN  org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigHadoopLogger - org.apache.pig.builtin.Utf8StorageConverter(FIELD_DISCARDED_TYPE_CONVERSION_FAILED): Unable to interpret value [115, 117, 98, 106, 101, 99, 116, 105, 118, 101, 34] in field being converted to int, caught NumberFormatException <For input string: "subjective""> field discarded
2016-04-06 01:13:17736[LocalJobRunner映射任务执行器0]WARN org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigHadoopLogger-org.apache.pig.builtin.Utf8StorageConverter(字段_丢弃_类型_转换_失败):无法解释值[112、114、111、103、114、97、109、109、105、110、103]在转换为int的字段中,捕获的NumberFormatException字段被丢弃

2016-04-06 01:13:17736[LocalJobRunner映射任务执行器0]WARN org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigHadoopLogger-org.apache.pig.builtin.Utf8StorageConverter(字段_丢弃_类型_转换_失败):无法解释转换为int的字段中的值[115、117、98、106、101、99、116、105、118、101、34],捕获的NumberFormatExceptionGROUP
操作符将具有相同组键(键字段)的元组组合在一起

COUNT
功能用于计算行李中的元素数量
COUNT
要求前面的
GROUP ALL
语句用于全局计数,而
GROUP BY
语句用于组计数

在您的情况下,您正在调用B上的count,其中数据是
过滤的
,而不是
分组的

您需要对数据分组的变量调用
COUNT

D = FOREACH C GENERATE COUNT(B.diffhours);

GROUP
操作符将具有相同组键(键字段)的元组分组在一起

COUNT
功能用于计算行李中的元素数量
COUNT
要求前面的
GROUP ALL
语句用于全局计数,而
GROUP BY
语句用于组计数

在您的情况下,您正在调用B上的count,其中数据是
过滤的
,而不是
分组的

您需要对数据分组的变量调用
COUNT

D = FOREACH C GENERATE COUNT(B.diffhours);

字段标记中嵌入的逗号导致了所有问题。由于您在模式中只定义了四个字段,Pig无法使用您定义的模式读取数据

PigStorage是一个非常简单的加载程序,它不处理特殊情况,例如嵌入式分隔符或转义控制字符;它将在分隔符的每个实例上拆分,而不考虑上下文

使用Piggybank的CSVExcelStorage()处理字段中的所有嵌入逗号

REGISTER /usr/lib/pig/piggybank.jar;
DEFINE CSVExcelStorage org.apache.pig.piggybank.storage.CSVExcelStorage; 
data1 = LOAD '/answers.csv' USING CSVExcelStorage();

然后执行脚本的其余部分。这将给你预期的结果

字段标记中嵌入的逗号造成了所有问题。由于您在模式中只定义了四个字段,Pig无法使用您定义的模式读取数据

PigStorage是一个非常简单的加载程序,它不处理特殊情况,例如嵌入式分隔符或转义控制字符;它将在分隔符的每个实例上拆分,而不考虑上下文

使用Piggybank的CSVExcelStorage()处理字段中的所有嵌入逗号

REGISTER /usr/lib/pig/piggybank.jar;
DEFINE CSVExcelStorage org.apache.pig.piggybank.storage.CSVExcelStorage; 
data1 = LOAD '/answers.csv' USING CSVExcelStorage();

然后执行脚本的其余部分。这将给你预期的结果

您的数据看起来如何?在您的问题中添加一些示例输入数据。您的数据看起来如何?在你的问题中添加一些示例输入数据。那么你的意思是说它应该是D=FOREACH C GENERATE COUNT(C.diffhours);。。。。?????那么你的意思是说它应该是D=FOREACH C GENERATE COUNT(C.diffhours);。。。。?????