在 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 中加载文件时如何忽略“(双引号)?的主要内容,如果未能解决你的问题,请参考以下文章