在 PIG 中加载文件时如何忽略“(双引号)?

Posted

技术标签:

【中文标题】在 PIG 中加载文件时如何忽略“(双引号)?【英文标题】:how can i ignore " (double quotes) while loading file in PIG? 【发布时间】:2014-07-03 13:11:52 【问题描述】:

我在文件中有以下数据

"a","b","1","2"
"a","b","4","3"
"a","b","3","1"

我正在使用以下命令读取此文件

File1 = LOAD '/path' using PigStorage (',') as (f1:chararray,f2:chararray,f3:int,f4:int)

但这里忽略了字段 3 和 4 的数据

如何正确读取此文件或以任何方式使 PIG 跳过 '"'

我正在使用 Apache Pig 0.10.0 版的其他信息

【问题讨论】:

你可以使用正则表达式,见***.com/questions/18931427/… @fxm 我不能使用蜂巢这是猪的具体要求:((我的运气不好) 【参考方案1】:

您可以使用REPLACE 函数(但不会一次性完成):

file1 = load 'your.csv' using PigStorage(',');
data = foreach file1 generate $0 as (f1:chararray), $1 as (f2:chararray), REPLACE($2, '\\"', '') as (f3:int), REPLACE($3, '\\"', '') as (f4:int);

您也可以使用带有REGEX_EXTRACT 的正则表达式:

file1 = load 'your.csv' using PigStorage(',');
data = foreach file1 generate $0, $1, REGEX_EXTRACT($2, '([0-9]+)', 1), REGEX_EXTRACT($3, '([0-9]+)', 1);

当然,您可以用同样的方式删除 f1 和 f2 的 "

【讨论】:

我觉得代码应该是:data = foreach file1 generate $0 as f1, $1 as f2, REPLACE($2, '\\"', '') as f3, REPLACE($3, '\ \"', '') 作为 f4; (我使用的是 hive 0.8.0) @Dexter 你的意思是让类型由 hive 推断? 是的。当我提到类型为“将 $0 生成为 (f1:chararray)”时,我得到了解析错误。然后尝试“将 $0 生成为 f1”,它起作用了。抱歉,正如我在上面的帖子中提到的蜂巢,它应该是 CDH3 上的猪 0.8.0。 我知道这已经很老了,但这对我不起作用。我有一个名为 'line' 的 chararray 字段,当我执行 replace(line, '\\"', '') 时,它返回:无法使用导入解析替换:[, java.lang., org.apache。 pig.builtin., org.apache.pig.impl.builtin.]【参考方案2】:

试试下面(无需转义或替换双引号):

using org.apache.pig.piggybank.storage.CSVExcelStorage() 

【讨论】:

添加一些解释,说明此答案如何帮助 OP 解决当前问题【参考方案3】:

如果您安装了Jython,您可以部署一个简单的UDF 来完成这项工作。

python UDF

#!/usr/bin/env python

'''
udf.py
'''

@outputSchema("out:chararray")
def formatter(item):
    chars = 'abcdefghijklmnopqrstuvwxyz'
    nums = '1234567890'
    new_item = item.split('"')[1]
    if new_item in chars:
        output = str(new_item)
    elif new_item in nums:
        output = int(new_item)

    return output

猪脚本

REGISTER 'udf.py' USING jython as udf;
data = load 'file' USING PigStorage(',') AS (col1:chararray, col2:chararray,
       col3:chararray, col4:chararray);
out = foreach data generate udf.formatter(col1) as a, udf.formatter(col3) as b;
dump out

(a,1)
(a,4)
(a,3)

【讨论】:

我忘了说这只是一个示例数据,它可能包含特殊字符。【参考方案4】:

使用REPLACE怎么样?如果case就这么简单?

data = LOAD 'YOUR_DATA' Using PigStorage(',') AS (a:chararray, b:chararray, c:chararray, d:chararray) ;

new_data = foreach data generate 
   REPLACE(a, '"', '') AS a,
   REPLACE(b, '"', '') AS b, 
   (int)REPLACE(c, '"', '') AS c:int, 
   (int)REPLACE(d, '"', '') AS d:int;

还有一个提示:如果您要加载 csv 文件,在 Excel 中设置正确的数字格式,类似工具也可能会有所帮助。

【讨论】:

【参考方案5】:

您可以使用 Pig 中的 CSVExcelStorage 加载程序。 数据中的双引号由这个加载器处理。 您必须注册 Piggy-bank jar 才能使用此加载程序。

Register $jar_location/piggybank-0.15.0.jar;

load_data = load '$data_location' using 
org.apache.pig.piggybank.storage.CSVExcelStorage(',');

希望这会有所帮助。

【讨论】:

以上是关于在 PIG 中加载文件时如何忽略“(双引号)?的主要内容,如果未能解决你的问题,请参考以下文章

在 PIG 中加载 CSV 文件

在 pig 中加载多个文件

在 pig 中加载多个文件 - 扩展

基于感兴趣的日期范围作为参数输入限制在 Pig Latin 中加载日志文件

Apache Pig - 在猪关系中加载时缺少数字数据

在 Hortonworks Sandbox 内的 Pig 脚本中加载 JSON 文件