Apache pig “我怎么能忽视?”;(双引号)在PIG中加载文件时?

Apache pig “我怎么能忽视?”;(双引号)在PIG中加载文件时?,apache-pig,hdfs,Apache Pig,Hdfs,我有以下资料存档 "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的数据 如何正确读取此文件或以任何方式使清管器跳过“ 其他信息我正在使用ApachePig版本0.10.0如果您安装了Jython,您可以部署一个

我有以下资料存档

"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的数据

如何正确读取此文件或以任何方式使清管器跳过“


其他信息我正在使用ApachePig版本0.10.0

如果您安装了
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)
您可以使用该功能(但不会一次完成):

您还可以将正则表达式用于:

当然,您可以用同样的方法擦除f1和f2的

使用如何?如果情况如此简单

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的工具中设置正确的数字格式也可能有帮助。

请尝试以下操作(无需转义或替换双引号):


您可以使用来自Pig的CSVExcelStorage loader。 数据中的双引号由此加载程序处理。 你必须注册小猪存钱罐才能使用这个加载器

寄存器${jar\u location}/piggybank-0.15.0.jar

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

希望这能有所帮助。

您可以使用正则表达式进行此操作,请参阅@fxm我不能使用hive这是pig的具体要求:((我的运气不好)我忘了提到这只是一个示例数据,它可能包含特殊字符。我想代码应该是:data=foreach file1生成$0作为f1,$1作为f2,替换($2,'\\\“,'')作为f3,替换($3,'\\”“,”)作为f4;(我使用的是hive 0.8.0)@Dexter您的意思是让hive推断类型?是的。当我提到类型为“生成$0作为(f1:chararray)”时,我得到了解析错误。然后尝试了“生成$0作为f1”,它成功了。抱歉,正如我在上面的帖子中提到的那样,它应该是CDH3上的pig 0.8.0。我知道这很旧,但对我来说不起作用。我有一个名为“line”的字符字段,当我进行替换(行“\\”,”)时,它返回:无法使用导入解析替换:[,java.lang.,org.apache.pig.builtin.,org.apache.pig.impl.builtin.]添加一些关于此答案如何帮助OP解决当前问题的解释
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;
using org.apache.pig.piggybank.storage.CSVExcelStorage() 
load_data = load '${data_location}' using 
org.apache.pig.piggybank.storage.CSVExcelStorage(',');