级联文本文件到Parquet

时间:2014-07-23 15:27:52

标签: hdfs file-conversion cascading parquet

我正在尝试使用Cascading将文件转换为Parquet。但我收到以下错误。

错误

Exception in thread "main" cascading.flow.planner.PlannerException: tap named: 'Copy', cannot be used as a sink: Hfs["ParquetTupleScheme[['A', 'B']->[ALL]]"]["/user/cloudera/htcountp"]
at cascading.flow.planner.FlowPlanner.verifyTaps(FlowPlanner.java:240)
at cascading.flow.planner.FlowPlanner.verifyAllTaps(FlowPlanner.java:174)
at cascading.flow.hadoop.planner.HadoopPlanner.buildFlow(HadoopPlanner.java:242)
at cascading.flow.hadoop.planner.HadoopPlanner.buildFlow(HadoopPlanner.java:80)
at cascading.flow.FlowConnector.connect(FlowConnector.java:459)
at first.Copy.main(Copy.java:49)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.hadoop.util.RunJar.main(RunJar.java:212)

代码

Scheme sourceScheme = new TextDelimited(new Fields("A","B"), ", ");
Scheme sinkScheme = new ParquetTupleScheme(new Fields("A", "B"));

// create the source tap
Tap inTap = new Hfs(sourceScheme, inPath );

// create the sink tap
Tap outTap = new Hfs( sinkScheme, outPath );

// specify a pipe to connect the taps
Pipe copyPipe = new Pipe("Copy"); 

// connect the taps, pipes, etc., into a flow
FlowDef flowDef = FlowDef.flowDef()
 .addSource( copyPipe, inTap )
 .addTailSink( copyPipe, outTap );

// run the flow
flowConnector.connect( flowDef ).complete();

2 个答案:

答案 0 :(得分:0)

遇到同样的问题。查看源代码,您必须将Parquet模式传递给ParquetTupleScheme的构造函数,以便它可以将数据序列化为HDFS。该类有一个方法isSink(),它检查以确保它在那里。否则,它不是接收器,代码会抛出您识别的错误。

答案 1 :(得分:0)

有点晚了。但是我也回来了同样的问题。 ParquetTupleScheme声明的另一种变体如下:

new ParquetTupleScheme(Fields SourceFields, Fields SinkFields, String ParquetSchema)

将接收方案的声明更改为如下所示:

Scheme sinkScheme = new ParquetTupleScheme(new Fields("A", "B"), new Fields("A", "B"), "message FileName { required Binary A , required Binary B }" );