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

zqdjd7g9  于 2021-06-21  发布在  Pig
关注(0)|答案(5)|浏览(327)

我有以下资料

"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

juzqafwq

juzqafwq1#

如果你有 Jython 你可以部署一个简单的 UDF 完成任务。
python自定义项


# !/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

Pig手稿

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)
pdkcd3nj

pdkcd3nj2#

你可以用 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,方法相同。

w8ntj3qf

w8ntj3qf3#

您可以使用来自pig的csvexcelstorage加载程序。数据中的双引号由这个加载程序处理。你必须注册存钱罐才能使用这个加载器。 Register ${jar_location}/piggybank-0.15.0.jar; ```
load_data = load '${data_location}' using
org.apache.pig.piggybank.storage.CSVExcelStorage(',');

希望这有帮助。
l5tcr1uw

l5tcr1uw4#

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

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

0pizxfdo5#

换用怎么样?如果这个案子这么简单?

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

相关问题