【问题标题】:APACHE PIG : Invalid field projection. Projected field [Date] does not existAPACHE PIG:无效的场投影。投影字段 [日期] 不存在
【发布时间】:2016-11-16 05:34:24
【问题描述】:

我知道这个问题之前已解决,但可能我的情况有所不同,而且我是新手并没有帮助,因此寻求您的指导 :) 我正在 POC 笔记本电脑设置中学习 PIG。 我有 4 个文本文件,每个文件有大约 50 列,包括一个日期列。这 4 个文本文件基本上包含 4 个不同月份(一月、二月、三月、四月)的数据。 我正在尝试合并这 4 个文本文件,将其保存在 hdfs 中,然后再次从该 UNION 中,我尝试使用日期列将数据拆分为 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(','); 

然后我对另一个变量做一个 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).

【问题讨论】:

  • 你试过用month_quad::Date替换Date
  • 尝试DESCRIBE month_quad 找出month_quad 的架构。
  • 我认为您应该使用“位置表示法”来访问日期列,因为您在声明关系时没有定义架构。根据您的屏幕截图,它将是 1 美元。
  • 感谢大家的慷慨回复。 @NirmalRam 谢谢 Nirmal,我试过了,但它再次给出了一个错误,提示“month_quad::Date 不存在。
  • @RobinTrietsch 嗨 Robin,架构未知。

标签: hadoop apache-pig


【解决方案1】:

我认为您应该使用“位置表示法”来访问日期列,因为您在声明关系时没有定义架构。根据您的屏幕截图,它将是 1 美元。

【讨论】:

    【解决方案2】:

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

    jan = LOAD 'hdfs:/data/testing/201201hourly.txt' using PigStorage(',');

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

    ...

    ...

    这里需要修改为

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

    ... 事实上,“日期”这个词是一个保留字,应该替换为其他名称,例如 DateVal。

    另外,一个简单的 (Date,4,6) 也无济于事。您需要添加 SUBSTRING(Date,4,6)。 注意:SUBSTRING 需要大写。 Pig 区分大小写。

    【讨论】:

    • 嗨 Sukdeb,是的,正如我在帖子中所说,我拥有的数据非常宽,有 50 列,因此对所有列进行数据输入看起来不可行。
    • 也同意 SUBSTRING 评论。实际上,我在编码时添加了它,但在准备问题时忘记将其放在这里。仍然非常感谢您指出! :)
    • 由于您的数据是基于 HDFS 的,因此您需要定义我提到的所有列。
    • 或者,如果您知道数据的位置,您可以使用 $ 参数。例如,$0 是第一个字段,$1 是第二个字段。因此,如果您的日期字段是第三个字段,您的 if 语句将类似于 IF (($3,4,6) == etc. etc..
    • @SukdebGanguli 请在回答问题时使用代码格式。
    猜你喜欢
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多