Pig 函数中的 StrSplit

Posted

技术标签:

【中文标题】Pig 函数中的 StrSplit【英文标题】:StrSplit in Pig functions 【发布时间】:2014-07-27 13:26:27 【问题描述】:

有人可以解释一下我如何在 Pigscript 中获得以下输出

我的输入文件在下面

一个.txt

aaa.kyl,data,data
bbb.kkk,data,data
cccccc.hj,data,data
qa.dff,data,data

我正在写这样的猪脚本

A = LOAD 'a.txt' USING PigStorage(',') AS(a1:chararray,a2:chararray,a3:chararray);
B = FOREACH A GENERATE FLATTEN(STRSPLIT(a1)),a2,a3;

我不知道如何处理这个.. 我需要像下面这样输出。基本上我需要第一个原子中的点符号之后的所有字符

(kyl,data,data)
(kkk,data,data)
(hj,data,data)
(dff,data,data)

谁能给我这个代码

【问题讨论】:

【参考方案1】:

这是你需要做的-

这是猪解析例程中遇到点时的转义问题,因为它被视为运算符,请参阅此链接以获取更多信息Dot Operator。

您可以对点使用 Unicode 转义序列:\u002E。但是,这也必须用斜杠转义并放在单引号字符串中。

以下代码将为您完成工作,您可以根据自己的方便对其进行微调 -

A = LOAD 'a.txt' USING PigStorage(',') AS(a1:chararray,a2:chararray,a3:chararray);
B = FOREACH A GENERATE FLATTEN(STRSPLIT(a1,'\\u002E')) as (a1:chararray, a1of1:chararray),a2,a3;
C = FOREACH B GENERATE a1of1,a2,a3;

希望这会有所帮助。

【讨论】:

很好的解释.. 我们是否也需要对管道符号和逗号应用这种 unicode 转义序列。 No not for pipe and comma check the pig documentation【参考方案2】:

您可以通过以下方式尝试使用 STRSPLIT(),

A = LOAD 'C:\\Users\\Ren\\Desktop\\file' USING PigStorage(',') AS(a1:chararray,a2:chararray,a3:chararray); 

B = foreach A generate SUBSTRING(a1,INDEXOF(a1,'.',0)+1,(int)SIZE(a1)),a2,a3;                                                                                 

【讨论】:

【参考方案3】:
A = LOAD 'a.txt' USING PigStorage(',') AS(a1:chararray,a2:chararray,a3:chararray);

B = FOREACH A GENERATE FLATTEN(STRSPLIT(a1,'.')),a2,a3;

这会将a1分成两部分,即点前和点后,您可以从中选择点后运算符。

C = foreach B generate $1,$2,$3;

$1 在点运算符之后

【讨论】:

以上是关于Pig 函数中的 StrSplit的主要内容,如果未能解决你的问题,请参考以下文章

Pig 函数中的 StrSplit

Pig Latin 中的用户定义函数

Pig Latin 中的 AVG() 函数问题

Pig 中的 SimpleTextLoader UDF

Pig系统分析-Pig可扩展性

如何从 Pig 中的 Python UDF 打印?