APACHE PIG:无效的字段投影。投影字段[日期]不存在

时间:2016-11-16 05:34:24

标签: hadoop apache-pig

我知道这个问题之前已经解决了,但可能我的情况有所不同,而且我是一个新手并没有帮助所以寻求你的指导:) 我在POC笔记本电脑设置中学习PIG。 我有4个文本文件,每个文件有大约50列,包括日期列。 4个文本文件基本上包含4个不同月份(jan,feb,mar,apr)的数据。 我试图将这4个文本文件联合起来,将其保存在hdfs中,然后再从该UNION中保存,我试图通过使用日期列将数据分成4个不同的SPLITS。 首先,我首先将4个文本文件加载到4个不同的变量中 -

jan = LOAD 'hdfs:/data/testing/201201hourly.txt' using PigStorage(','); 
feb = LOAD 'hdfs:/data/testing/201202hourly.txt' using PigStorage(','); 
mar = LOAD 'hdfs:/data/testing/201203hourly.txt' using PigStorage(','); 
apr = LOAD 'hdfs:/data/testing/201204hourly.txt' using PigStorage(','); 

然后我将UNION转换为另一个变量 -

month_quad = union jan,feb,mar,apr; 

然后我将UNION存储到hdfs -

store month_quad into 'hdfs:/data/big/pigresult/month_quad';

到目前为止,我可以看到hdfs中的数据加载为64 mb块。第一部分包含列和数据。pig screenshot 希望我能够成功上传链接到屏幕截图,显示hdfs中的数据:)

现在我尝试使用以下脚本进行拆分 -

split month_quad into split_jan IF ((Date,4,6) == '01'), split_feb
IF ((Date,4,6) == '02'), split_mar IF ((Date,4,6)=='03'),
split_apr IF ((Date,4,6) == '04');

我在运行上面的脚本时遇到错误,说"无效的字段投影。预计字段[日期]不存在。"

2016-11-16 10:56:21,594 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1025: 
<line 7, column 47> Invalid field projection. Projected field [Date] does not exist.
Details at logfile: /home/XXXXX/pig_1479273726378.log

我确实认识到在jan,feb,mar,apr中加载数据时我没有定义任何数据类型,但考虑到我拥有的数据有50列,我不确定如何解决它。 我正在使用hadoop 2.4。和猪版本0.15。 请指导我:))

编辑: 我能够使用位置表示法使用@Amit的建议来解决这个问题。所以我修改的分割脚本如下。它确实给了我两个警告但是做了伎俩。

grunt> split month_quad into split_jan IF (SUBSTRING($1,4,6) == '01'),
>> split_feb IF (SUBSTRING($1,4,6) == '02'),                      
>> split_mar IF (SUBSTRING($1,4,6) == '03'),                      
>> split_apr IF (SUBSTRING($1,4,6) == '04');                      
2016-11-17 08:32:20,050 [main] WARN  org.apache.pig.newplan.BaseOperatorPlan - Encountered Warning IMPLICIT_CAST_TO_CHARARRAY 8 time(s).
2016-11-17 08:32:20,050 [main] WARN  org.apache.pig.newplan.BaseOperatorPlan - Encountered Warning USING_OVERLOADED_FUNCTION 8 time(s).

2 个答案:

答案 0 :(得分:0)

在声明性陈述中,您需要添加字段名称。 你的陈述如下:

jan = LOAD&#39; hdfs:/data/testing/201201hourly.txt'使用PigStorage(&#39;,&#39;);

feb = LOAD&#39; hdfs:/data/testing/201202hourly.txt'使用PigStorage(&#39;,&#39;);

...

...

这需要修改为

jan = LOAD&#39; hdfs:/data/testing/201201hourly.txt'使用PigStorage(&#39;,&#39;)       AS(日期:chararray,field2:chararray,.....);

... 事实上,&#34;日期&#34;是保留字,应替换为其他名称,例如DateVal。

另外,简单(日期,4,6)不会有帮助。你需要添加SUBSTRING(日期,4,6)。 注意:SUBSTRING需要大写。猪是区分大小写的。

答案 1 :(得分:0)

我认为你应该使用&#34;位置符号&#34;访问Date列,因为在声明Relation时没有定义架构。根据您的截图,它将是1美元。