pig pass tab(\t)作为动态csv解析的参数

tp5buhyn  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(265)

我正在使用文件中的任何分隔符数据解析数据文件(csv、'tsv'\t'''''';')该方法使用“,”和“;”但不能使用tab'\t',我们如何将tab作为参数传递给pig?
python代码

delimiter = '\t'
cmd = 'pig -f sample.pig -p file='+data_file +' -p delimiter=' + delimiter
subprocess.Popen(cmd, shell=True, stderr=subprocess.STDOUT)

Pig

-- 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> ...
8yparm6h

8yparm6h1#

这里不要用贝壳;tab是shell的空白,不作为参数发送:

cmd = ['pig', '-f', 'sample.pig', '-p', 'file=' + data_file, '-p',
       'delimiter=' + delimiter]
subprocess.Popen(cmd, stderr=subprocess.STDOUT)

注意我要走了 shell 默认值 False 在这里;当您只需调用 pig 直接。与 shell 左至 False ,则在中传入参数列表。
即使如此,我想你还是得付出代价 pig 顺序 \t (两个字符):

delimiter = '\\t'

或使用原始字符串:

delimiter = r'\t'

如果这不起作用,你将不得不求助于特殊套管;我只阅读pig拉丁表达式参考,所以这是未经测试的,但我会使用条件表达式和 TAB 作为命令行参数:

results = LOAD '$file' USING PigStorage('$delimiter' == 'TAB' ? '\t' : '$delimiter');

在python中:

delimiter = 'TAB'

相关问题