我想使用Apache Pig构建一个大键 - >值映射,在地图中查找并迭代键.然而,甚至似乎没有做这些事情的语法; 我检查了手册,维基,示例代码,象书,谷歌,甚至尝试解析解析器源.每个示例都从文件加载地图文字...然后从不使用它们.你怎么用Pig的地图?
首先,似乎没有办法直接将2列CSV文件加载到地图中.如果我有一个简单的map.csv:
1,2
3,4
5,6
Run Code Online (Sandbox Code Playgroud)
我尝试将其加载为地图:
m = load 'map.csv' using PigStorage(',') as (M: []);
dump m;
Run Code Online (Sandbox Code Playgroud)
我得到三个空元组:
()
()
()
Run Code Online (Sandbox Code Playgroud)
所以我尝试加载元组然后生成地图:
m = load 'map.csv' using PigStorage(',') as (key:chararray, val:chararray);
b = foreach m generate [key#val];
ERROR 1000: Error during parsing. Encountered " "[" "[ "" at line 1, column 24.
...
Run Code Online (Sandbox Code Playgroud)
语法的许多变体也会失败(例如generate [$0#$1]).
好的,所以我把我的地图变成Pig的地图文字格式map.pig:
[1#2]
[3#4]
[5#6]
Run Code Online (Sandbox Code Playgroud)
加载它:
m = load 'map.pig' as (M: []);
Run Code Online (Sandbox Code Playgroud)
现在让我们加载一些键并尝试查找:
k = …Run Code Online (Sandbox Code Playgroud) A = load 'a.txt' as (id, a1);
B = load 'b.txt as (id, b1);
C = join A by id, B by id;
D = foreach C generate id,a1,b1;
dump D;
Run Code Online (Sandbox Code Playgroud)
第4行失败:
Invalid field projection. Projected field [id] does not exist in schema
我试图改为A.id,但最后一行失败了: ERROR 0: Scalar has more than one row in the output.
我在s3中有很多gzip的日志文件,它有3种类型的日志行:b,c,i.我和c都是单级json:
{"this":"that","test":"4"}
Run Code Online (Sandbox Code Playgroud)
类型b是深度嵌套的json.我遇到了一个关于编译罐子来完成这项工作的要点.由于我的java技能不是很好,我真的不知道该怎么做.
{"this":{"foo":"bar","baz":{"test":"me"},"total":"5"}}
Run Code Online (Sandbox Code Playgroud)
由于类型i和c并不总是以相同的顺序,这使得指定生成正则表达式中的所有内容变得困难.使用Pig可以处理JSON(在gzip文件中)吗?我正在使用任何版本的Pig来自Amazon Elastic Map Reduce实例.
这归结为两个问题:1)我可以用猪解析JSON(如果是的话,如何)?2)如果我可以解析JSON(来自gzip的日志文件),我可以解析嵌套的JSON对象吗?
Pig和Hive有什么区别?我发现两者都具有相同的功能意义,因为它们用于做同样的工作.唯一的事情就是两种情况都有所不同.那么何时使用和哪种技术?两者的规格是否明确显示了两者在适用性和性能方面的差异?
在开发使用STORE命令的Pig脚本时,我必须删除每次运行的输出目录,否则脚本会停止并提供:
2012-06-19 19:22:49,680 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 6000: Output Location Validation Failed for: 'hdfs://[server]/user/[user]/foo/bar More info to follow:
Output directory hdfs://[server]/user/[user]/foo/bar already exists
Run Code Online (Sandbox Code Playgroud)
所以我正在寻找一个in-Pig解决方案来自动删除目录,如果目录在呼叫时不存在,那么该目录也不会阻塞.
在Pig Latin Reference中我找到了shell命令调用者fs.不幸的是,只要出现任何错误,Pig脚本就会中断.所以我不能用
fs -rmr foo/bar
Run Code Online (Sandbox Code Playgroud)
(即递归删除)因为如果目录不存在它会中断.我想我可以用一会儿
fs -test -e foo/bar
Run Code Online (Sandbox Code Playgroud)
这是一个测试,不应该打破或所以我想.但是,Pig再次将test不存在的目录上的返回代码解释为失败代码并中断.
Pig项目有一个JIRA票据解决了我的问题,并为STORE命令建议了一个可选参数OVERWRITE或FORCE_WRITE.无论如何,我正在使用Pig 0.8.1,并且没有这样的参数.
我有已经分组和聚合的数据,它看起来像这样:
user value count
---- -------- ------
Alice third 5
Alice first 11
Alice second 10
Alice fourth 2
...
Bob second 20
Bob third 18
Bob first 21
Bob fourth 8
...
Run Code Online (Sandbox Code Playgroud)
对于每个用户(Alice和Bob),我想要检索他们的前n个值(比方说2),排序的'count'项.所以我想要的输出是这样的:
Alice first 11
Alice second 10
Bob first 21
Bob second 20
Run Code Online (Sandbox Code Playgroud)
我怎么能做到这一点?
我需要这个猪脚本的帮助.我刚收到一条记录.我正在选择2列并在另一列上进行计数(不同),同时还使用where where子句来查找特定描述(desc).
这是我的猪我的sql我试图编码.
/*
For example in sql:
select domain, count(distinct(segment)) as segment_cnt
from table
where desc='ABC123'
group by domain
order by segment_count desc;
*/
A = LOAD 'myoutputfile' USING PigStorage('\u0005')
AS (
domain:chararray,
segment:chararray,
desc:chararray
);
B = filter A by (desc=='ABC123');
C = foreach B generate domain, segment;
D = DISTINCT C;
E = group D all;
F = foreach E generate group, COUNT(D) as segment_cnt;
G = order F by segment_cnt DESC;
Run Code Online (Sandbox Code Playgroud) 我想按给定字段进行分组,并使用分组字段获取输出.以下是我想要实现的一个例子: -
想象一下名为'sample_table'的表,其中有两列如下: -
F1 F2
001 111
001 222
001 123
002 222
002 333
003 555
Run Code Online (Sandbox Code Playgroud)
我想编写Hive Query,它将提供以下输出: -
001 [111, 222, 123]
002 [222, 333]
003 [555]
Run Code Online (Sandbox Code Playgroud)
在猪中,这可以通过以下方式轻松实现: -
grouped_relation = GROUP sample_table BY F1;
Run Code Online (Sandbox Code Playgroud)
有人可以建议在Hive中有一个简单的方法吗?我能想到的是为此编写用户定义函数(UDF),但这可能是一个非常耗时的选项.
实际上我正在编写PIG脚本,并且如果满足其中一个条件,则希望执行一些语句.
我设置了一个变量并检查该变量的某些值.假设
if flag==0 then
A = LOAD 'file' using PigStorage() as (f1:int, ....);
B = ...;
C = ....;
else
again some Pig Latin statements
Run Code Online (Sandbox Code Playgroud)
我可以在PIG脚本中执行此操作吗?如果是,那我该怎么做?
谢谢.
我正在使用Hadoop 2.0.5运行Apache Pig .11.1.
我在Pig中运行的大多数简单工作都非常好.
但是,每当我尝试在大型数据集或LIMIT运算符上使用GROUP BY时,我都会收到以下连接错误:
2013-07-29 13:24:08,591 [main] INFO org.apache.hadoop.mapred.ClientServiceDelegate - Application state is completed. FinalApplicationStatus=SUCCEEDED. Redirecting to job history server
013-07-29 11:57:29,421 [main] INFO org.apache.hadoop.ipc.Client - Retrying connect to server: 0.0.0.0/0.0.0.0:10020. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1 SECONDS)
2013-07-29 11:57:30,421 [main] INFO org.apache.hadoop.ipc.Client - Retrying connect to server: 0.0.0.0/0.0.0.0:10020. Already tried 1 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1 SECONDS)
2013-07-29 11:57:31,422 [main] INFO org.apache.hadoop.ipc.Client - Retrying connect to server: 0.0.0.0/0.0.0.0:10020. Already tried 2 time(s); …Run Code Online (Sandbox Code Playgroud)