APACHE PIG:无效的场投影。投影字段 [日期] 不存在
APACHE PIG : Invalid field projection. Projected field [Date] does not exist
我知道这个问题之前已经解决了,但可能我的情况有所不同,而且我是新手也无济于事,所以寻求您的指导:)
我正在 POC 笔记本电脑设置中学习 PIG。
我有 4 个文本文件,每个文件都有大约 50 列,包括日期列。 4 个文本文件基本上包含 4 个不同月份(一月、二月、三月、四月)的数据。
我正在尝试合并这 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
希望我能够成功将 link 上传到显示 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');
当我 运行 上述脚本时出现错误,说 "Invalid field projection. Projected field [Date] does not exist."
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 列,我不确定如何解决它。
我正在使用 hadoop 2.4。和 Pig 版本 0.15。
请指导我:)
编辑:
我能够通过使用位置符号使用@Amit 的建议来解决这个问题。所以我修改后的拆分脚本如下。它确实给了我两个警告,但成功了。
grunt> split month_quad into split_jan IF (SUBSTRING(,4,6) == '01'),
>> split_feb IF (SUBSTRING(,4,6) == '02'),
>> split_mar IF (SUBSTRING(,4,6) == '03'),
>> split_apr IF (SUBSTRING(,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).
在您的声明性语句中,您需要添加字段名称。
你的陈述如下:
jan = 使用 PigStorage(',');
加载 'hdfs:/data/testing/201201hourly.txt'
feb = 加载 'hdfs:/data/testing/201202hourly.txt' 使用 PigStorage(',');
...
...
这需要修改为
jan = 使用 PigStorage(',') 加载 'hdfs:/data/testing/201201hourly.txt'
AS (日期:chararray, field2:chararray, .....);
...
事实上 "Date" 这个词是一个保留字,应该用其他名称代替,例如 DateVal.
此外,简单的 (Date,4,6) 也无济于事。您需要添加 SUBSTRING(Date,4,6)。
注意:SUBSTRING 需要大写。 Pig 区分大小写。
我认为您应该使用 "Positional notation" 来访问日期列,因为您在声明关系时没有定义模式。根据您的屏幕截图,它将是 1 美元。
我知道这个问题之前已经解决了,但可能我的情况有所不同,而且我是新手也无济于事,所以寻求您的指导:) 我正在 POC 笔记本电脑设置中学习 PIG。 我有 4 个文本文件,每个文件都有大约 50 列,包括日期列。 4 个文本文件基本上包含 4 个不同月份(一月、二月、三月、四月)的数据。 我正在尝试合并这 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 希望我能够成功将 link 上传到显示 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');
当我 运行 上述脚本时出现错误,说 "Invalid field projection. Projected field [Date] does not exist."
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 列,我不确定如何解决它。 我正在使用 hadoop 2.4。和 Pig 版本 0.15。 请指导我:)
编辑: 我能够通过使用位置符号使用@Amit 的建议来解决这个问题。所以我修改后的拆分脚本如下。它确实给了我两个警告,但成功了。
grunt> split month_quad into split_jan IF (SUBSTRING(,4,6) == '01'),
>> split_feb IF (SUBSTRING(,4,6) == '02'),
>> split_mar IF (SUBSTRING(,4,6) == '03'),
>> split_apr IF (SUBSTRING(,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).
在您的声明性语句中,您需要添加字段名称。 你的陈述如下:
jan = 使用 PigStorage(',');
加载 'hdfs:/data/testing/201201hourly.txt'feb = 加载 'hdfs:/data/testing/201202hourly.txt' 使用 PigStorage(',');
...
...
这需要修改为
jan = 使用 PigStorage(',') 加载 'hdfs:/data/testing/201201hourly.txt' AS (日期:chararray, field2:chararray, .....);
... 事实上 "Date" 这个词是一个保留字,应该用其他名称代替,例如 DateVal.
此外,简单的 (Date,4,6) 也无济于事。您需要添加 SUBSTRING(Date,4,6)。 注意:SUBSTRING 需要大写。 Pig 区分大小写。
我认为您应该使用 "Positional notation" 来访问日期列,因为您在声明关系时没有定义模式。根据您的屏幕截图,它将是 1 美元。