我正在使用文件中的任何分隔符数据解析数据文件(CSV',' TSV' \ t''&#39 ;;') 该方法适用于','和';'但不是使用标签' \ t',我们如何将标签作为参数传递给猪?
python代码
delimiter = '\t'
cmd = 'pig -f sample.pig -p file='+data_file +' -p delimiter=' + delimiter
subprocess.Popen(cmd, shell=True, stderr=subprocess.STDOUT)
猪
-- REGISTER 'piggybank.jar'
-- may use CSVExcelStorage in future
results = LOAD '$file' USING PigStorage('$delimiter');
我遇到了异常
2014-03-31 03:26:41,412 [main] INFO org.apache.pig.tools.parameters.ParameterSubstitutionPreprocessor - The parameter: "delimiter= " cannot be parsed by Pig. Please double check it
2014-03-31 03:26:41,412 [main] INFO org.apache.pig.tools.parameters.ParameterSubstitutionPreprocessor - Parser give the follow error message:
2014-03-31 03:26:41,413 [main] INFO org.apache.pig.tools.parameters.ParameterSubstitutionPreprocessor - Encountered "<EOF>" at line 1, column 16.
Was expecting one of:
<IDENTIFIER> ...
<OTHER> ...
<LITERAL> ...
<SHELLCMD> ...
答案 0 :(得分:1)
不要在这里使用shell; tab是shell的空格,不作为参数发送:
cmd = ['pig', '-f', 'sample.pig', '-p', 'file=' + data_file, '-p',
'delimiter=' + delimiter]
subprocess.Popen(cmd, stderr=subprocess.STDOUT)
请注意,我要将shell
留给此处的默认False
;当您可以直接调用pig
时,无需将此命令传递给shell。将shell
留给False
,而是传入参数列表。
即便如此,我认为您可能需要pig
序列\t
(两个字符):
delimiter = '\\t'
或使用原始字符串:
delimiter = r'\t'
如果这不起作用,你将不得不采用特殊套管;我只阅读pig latin expressions reference,所以这是未经测试的,但我会使用条件表达式并TAB
作为命令行参数:
results = LOAD '$file' USING PigStorage('$delimiter' == 'TAB' ? '\t' : '$delimiter');
在Python中:
delimiter = 'TAB'