Pig pass tab(\ t)作为动态CSV解析的参数

时间:2014-03-30 21:31:57

标签: java python hadoop apache-pig

我正在使用文件中的任何分隔符数据解析数据文件(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> ...

1 个答案:

答案 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'