我正在编写我自己的pig store类,我不想将其存储在文件中,我计划将其发送到第三方数据存储(缺少api调用)。
注意:我在cloudera的virtualbox映像上运行它。
我已经编写了java类(如下所示),并创建了mystore.jar,我正在下面的id.pig脚本中使用它:
store B INTO 'mylocation' USING MyStore('mynewlocation')
使用pig运行此脚本时,我看到以下错误:错误6000:的输出位置验证失败:'file://home/cloudera/test/id.out 更多信息如下:输出目录未设置。
or.apache.pig.impl.plan.VisitorException: ERROR 6000:
at or.apache.pig.newplan.logical.rules.InputOutputFileValidator$InputOutputFileValidator.visit(InputOutputFileValidator.java:95)
请帮帮我!
5条答案
按热度按时间7qhs6swi1#
首先,我认为应该使用作业配置来存储位置值,而不是示例变量
在规划作业时,将调用setstorelocation方法中对局部变量“location”的赋值,但在执行阶段之前可能不会调用getoutputformat,此时可能不再设置location变量(可能已创建类的新示例)。
如果你从源头上寻找
PigStorage.setStoreLocation
,您应该注意到它们将位置存储在作业配置中(第2行):所以我认为应该将位置存储在作业变量中:
您的自定义输出格式可以在createrecordreader方法中提取:
最后(可能是您看到的错误的实际原因),您的输出格式扩展了textoutputformat,并且您使用
getDefaultWorkFile
方法-此方法需要知道在hdfs中将文件输出到何处,而您没有调用FileOutputFormat.setOutputPath(job, new Path(location));
在setstorelocation方法中(请参阅前面粘贴的pigstorage.setstorelocation方法)。所以这个错误是因为它不知道在哪里创建默认的工作文件。ttvkxqim2#
--
3pvhb19x3#
--
我漏了什么吗?
qvtsj1bj4#
mystore.java文件
0tdrvxhp5#
mystoreoutputformat.java文件