我正在尝试创建一个更改列顺序的PIG脚本。这是我到目前为止所提出的:
inputdata = LOAD 'path/to/file/on/hdfs' USING PigStorage() AS (param1:chararray, param2:chararray, param3:chararray);
outputdata = FOREACH inputdata GENERATE param1, param3, param2;
DUMP outputdata;
我还没有在HDFS上试过这个,但我想我会继续先写单元测试。不幸的是它不起作用。
单元测试代码:
PigTest test = new PigTest("path_to_script.pig");
FixHadoopOnWindows.runFix();
String[] input = {
"valueparam1\tvalueparam2\tvalueparam3"
};
String[] output = {
"valueparam1\tvalueparam3\tvalueparam2"
};
test.assertOutput("inputdata", input, "outputdata", output);
FixHadoopOnWindows位是一个修复,所以我可以轻松地在Windows机器上运行我的单元测试。我在一些博客中找到了它,它帮助我解决了我遇到的许可问题。
所以现在我的测试运行了,但问题是assertOutput失败了。当我检查差异时,我明白了:
预期:
valueparam1 valueparam3 valueparam2
实际值:
(valueparam1,valueparam3,valueparam2)
所以我得到这些括号和逗号是我从未要求的。现在我不确定这是否是我的单元测试代码或我的实际脚本中的错误,所以任何让我入门的建议都会很棒。感谢。
答案 0 :(得分:2)
您的代码看起来不错。括号表示您的关系outputdata由具有三个值的元组组成。
如果您以后想要按标签分隔数据,请执行STORE outputdata INTO 'dest' USING PigStorage('\t');
http://pig.apache.org/docs/r0.11.0/basic.html#Data+Types+and+More
答案 1 :(得分:1)
想出来。 PigUnit读出outputdata值,这是PIG中的元组。直到我将它存储到文件中,才将元组转换为制表符分隔的记录。