apache pig:字段投影无效投影字段[日期]不存在

xfb7svmp  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(387)

我知道这个问题已经解决了,但可能我的情况是不同的,我作为一个新手是没有帮助,所以寻求您的指导:)我在学习Pig在一个poc笔记本电脑设置。我有4个文本文件,每个文件有大约50列,包括一个日期列。这4个文本文件基本上包含4个不同月份(1月、2月、3月、4月)的数据。我尝试将这4个文本文件合并,保存在hdfs中,然后再次从该合并中,我尝试使用date列将数据拆分为4个不同的拆分。首先我要把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(',');

然后我把一个并集变成另一个变量-

month_quad = union jan,feb,mar,apr;

然后我将联合存储到hdfs中-

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

到目前为止还不错,我可以看到hdfs中的数据加载为64mb块。第一部分包含列和数据。pig截图希望我能够成功地将链接上传到一个以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

我确实认识到,在1月、2月、3月、4月加载数据时,我没有定义任何数据类型,但考虑到我拥有的数据有50列,所以不确定如何处理它。我正在使用hadoop2.4。和pig版本0.15。请引导我:)
edit:我使用@amit的建议通过使用位置符号解决了这个问题。所以我修改的split脚本如下。它确实给了我两次警告,但成功了。

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).
ymzxtsji

ymzxtsji1#

我认为应该使用“位置符号”来访问日期列,因为在声明关系时没有定义模式。根据你的截图是1美元。

rqqzpn5f

rqqzpn5f2#

在声明性语句中,需要添加字段名。你的陈述如下:
jan=使用pigstorage(',')加载'hdfs:/data/testing/201201hourly.txt';
feb=使用pigstorage(',')加载'hdfs:/data/testing/201202hourly.txt';
...
...
这需要修改为
jan=load'hdfs:/data/testing/201201hourly.txt'使用pigstorage(',')作为(date:chararray,字段2:chararray,…);
... 事实上,单词“date”是一个保留字,应该用其他名称替换,例如dateval。
而且,一个简单的(日期,4,6)也没用。您需要添加子字符串(date,4,6)。注意:子字符串需要大写。pig区分大小写。

相关问题