我知道这个问题已经解决了,但可能我的情况是不同的,我作为一个新手是没有帮助,所以寻求您的指导:)我在学习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).
2条答案
按热度按时间ymzxtsji1#
我认为应该使用“位置符号”来访问日期列,因为在声明关系时没有定义模式。根据你的截图是1美元。
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区分大小写。