使用模式加载数据时出现 Apache Pig ClassCast 异常
Posted
技术标签:
【中文标题】使用模式加载数据时出现 Apache Pig ClassCast 异常【英文标题】:Apache Pig ClassCast exception when loading data with schema 【发布时间】:2015-01-01 00:01:43 【问题描述】:我有一个简单的制表符分隔文件,其中包含一个猪模式,我正在尝试加载并添加两列。当我使用 PigStorage 的“--schema”选项加载时,添加失败并出现 ClassCastException。当我使用“--noschema”加载时,添加工作正常。为什么 Pig 在前一种情况下会失败并出现异常?
这里是示例文件,只有 1 行输入,带有制表符分隔值:
a 1 1
架构“.pig_schema”如下所示:
"fields":["name":"str","type":55,"description":"autogenerated from Pig Field Schema","schema":null,"name":"score","type":15,"description":"autogenerated from Pig Field Schema","schema":null,"name":"count","type":15,"description":"autogenerated from Pig Field Schema","schema":null],"version":0,"sortKeys":[],"sortKeyOrders":[]
这里是来自 grunt shell 的语句列表:
a1 = load '/local/workplace/data' using PigStorage(); --load with schema
describe a1; -- a1: str: chararray,score: long,count: long
b1 = foreach a1 generate score + count;
dump b1; -- throws exception
a2 = load '/local/workplace/data' using PigStorage('\t', '--noschema') as (str:chararray, score:long, count: long);
b2 = foreach a2 generate score+count; -- no exception
dump b2; -- works fine
抛出的异常是:
org.apache.pig.backend.executionengine.ExecException: ERROR 0: Exception while execution [Add (Name: Add[long] - scope-34 Operator Key: scope-34) chi ldren: [[POProject (Name: Project[long][0] - scope-32 Operator Key: scope-32) children: null at []], [POProject (Name: Project[long][1] - scope-33操作 erator Key: scope-33) children: null at []]] at []]: java.lang.ClassCastException: org.apache.pig.data.DataByteArray 无法转换为 java.lang.Numb 呃 在 org.apache.pig.backend.hadoop.executionengine.physicalLayer.PhysicalOperator.getNext(PhysicalOperator.java:338) 在 org.apache.pig.backend.hadoop.executionengine.physicalLayer.relationalOperators.POForEach.processPlan(POForEach.java:378) 在 org.apache.pig.backend.hadoop.executionengine.physicalLayer.relationalOperators.POForEach.getNextTuple(POForEach.java:298) 在 org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigGenericMapBase.runPipeline(PigGenericMapBase.java:282) 在 org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigGenericMapBase.map(PigGenericMapBase.java:277) 在 org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigGenericMapBase.map(PigGenericMapBase.java:64) 在 org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144) 在 org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:763) 在 org.apache.hadoop.mapred.MapTask.run(MapTask.java:369) 在 org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:210) 引起:java.lang.ClassCastException:org.apache.pig.data.DataByteArray 不能转换为 java.lang.Number 在 org.apache.pig.backend.hadoop.executionengine.physicalLayer.expressionOperators.Add.genericGetNext(Add.java:100) 在 org.apache.pig.backend.hadoop.executionengine.physicalLayer.expressionOperators.Add.getNextLong(Add.java:123) 在 org.apache.pig.backend.hadoop.executionengine.physicalLayer.PhysicalOperator.getNext(PhysicalOperator.java:323)
猪版本:0.12.1
【问题讨论】:
是的,你是对的,它看起来像是 0.12 中的一些问题。相同的命令在 0.13 版本中运行良好。 【参考方案1】:默认情况下,如果您提供模式,则所有内容都被视为字节数组。
【讨论】:
以上是关于使用模式加载数据时出现 Apache Pig ClassCast 异常的主要内容,如果未能解决你的问题,请参考以下文章
使用 Apache Pig 将数据加载到 Hbase 表时,如何排除 csv 或文本文件中没有数据(只有空格)的列?