Apache Pig v0.7可以读取gzip文件而不需要额外的努力,例如:
MyData = LOAD '/tmp/data.csv.gz' USING PigStorage(',') AS (timestamp, user, url);
Run Code Online (Sandbox Code Playgroud)
我可以处理该数据并将其输出到磁盘上:
PerUser = GROUP MyData BY user;
UserCount = FOREACH PerUser GENERATE group AS user, COUNT(MyData) AS count;
STORE UserCount INTO '/tmp/usercount' USING PigStorage(',');
Run Code Online (Sandbox Code Playgroud)
但输出文件未压缩:
/tmp/usercount/part-r-00000
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉STORE命令以gzip格式输出内容?请注意,理想情况下我想要一个适用于Pig 0.6的答案,因为我希望使用Amazon Elastic MapReduce; 但如果有任何版本的猪的解决方案,我想听听它.
我正在尝试使用oozie做一个简单的工作.
这将是一个简单的猪行动.
我有一个文件:FirstScript.pig包含:
dual = LOAD 'default.dual' USING org.apache.hcatalog.pig.HCatLoader();
store dual into 'dummy_file.txt' using PigStorage();
Run Code Online (Sandbox Code Playgroud)
和一个workflow.xml包含:
<workflow-app name="FirstWorkFlow" xmlns="uri:oozie:workflow:0.2">
<start to="FirstJob"/>
<action name="FirstJob">
<pig>
<job-tracker>hadoop:50300</job-tracker>
<name-node>hdfs://hadoop:8020</name-node>
<script>/FirstScript.pig</script>
</pig>
<ok to="okjob"/>
<error to="errorjob"/>
</action>
<ok name='okjob'>
<message>job OK, message[${wf:errorMessage()}]</message>
</ok>
<error name='errorjob'>
<message>job error, error message[${wf:errorMessage()}]</message>
</error>
</workflow-app>
Run Code Online (Sandbox Code Playgroud)
我创建了结构:
FirstScript
|- lib
|---FirstScript.pig
|- workflow.xml
Run Code Online (Sandbox Code Playgroud)
现在怎么办?如何部署它并与oozie一起运行?
任何人都可以获得经验帮助
关心
帕维尔
我正在尝试编写一个pig latin脚本来提取我已经过滤的数据集的计数.
到目前为止这是脚本:
/* scans by title */
scans = LOAD '/hive/scans/*' USING PigStorage(',') AS (thetime:long,product_id:long,lat:double,lon:double,user:chararray,category:chararray,title:chararray);
productscans = FILTER scans BY (title MATCHES 'proactiv');
scancount = FOREACH productscans GENERATE COUNT($0);
DUMP scancount;
Run Code Online (Sandbox Code Playgroud)
出于某种原因,我收到错误:
无法将org.apache.pig.builtin.COUNT的匹配函数推断为多个或不适合.请使用明确的演员.
我在这做错了什么?我假设它与我传入的字段类型有关,但我似乎无法解决这个问题.
TIA,Jason
我的数据处理中的一个常见模式是按一组列进行分组,应用过滤器,然后再次展平.例如:
my_data_grouped = group my_data by some_column;
my_data_grouped = filter my_data_grouped by <some expression>;
my_data = foreach my_data_grouped flatten(my_data);
Run Code Online (Sandbox Code Playgroud)
这里的问题是,如果my_data在此操作之后以类似(c1,c2,c3)的模式开始,它将具有类似(mydata :: c1,mydata :: c2,mydata :: c3)的模式.如果列是唯一的,有没有办法轻松剥离"mydata ::"前缀?
我知道我可以这样做:
my_data = foreach my_data generate c1 as c1, c2 as c2, c3 as c3;
Run Code Online (Sandbox Code Playgroud)
然而,对于具有大量列的数据集而言,这很难维护并且对于具有可变列的数据集是不可能的.
我正在使用PigLatin过滤一些记录.
User1 8 NYC
User1 9 NYC
User1 7 LA
User2 4 NYC
User2 3 DC
Run Code Online (Sandbox Code Playgroud)
该脚本应删除用户的副本,并保留其中一个记录.像linux中的唯一命令.
输出应该是:
User1 8 NYC
User2 4 NYC
Run Code Online (Sandbox Code Playgroud)
有什么建议?
我在Pig中有这个代码(win,request和response只是直接从filesystem加载的表):
win_request = JOIN win BY bid_id, request BY bid_id;
win_request_response = JOIN win_request BY win.bid_id, response BY bid_id;
win_group = GROUP win_request_response BY (win.campaign_id);
win_count = FOREACH win_group GENERATE group, SUM(win.bid_price);
Run Code Online (Sandbox Code Playgroud)
基本上我想在加入和分组后总结bid_price,但是我收到一个错误:
Could not infer the matching function for org.apache.pig.builtin.SUM as multiple or none of them fit. Please use an explicit cast.
Run Code Online (Sandbox Code Playgroud)
我的猜测是我没有正确指出win.bid_price.
我正在使用PigLatin,使用咕噜声,每次我倾倒'东西,我的控制台被骂等等等等,等等非信息,有没有办法压制所有这些?
grunt> A = LOAD 'testingData' USING PigStorage(':'); dump A;
2013-05-06 19:42:04,146 [main] INFO org.apache.pig.tools.pigstats.ScriptState - 脚本中使用的Pig功能:UNKNOWN
2013-05-06 19:42:04,147 [main] INFO
组织. apache.pig.backend.hadoop.executionengine.mapReduceLayer.MRCompiler - 文件级联阈值:100乐观?假...
...
---另一个像50行无用的情况下在这里重挫垃圾......直到---
...
...
org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher -成功!
现在我喜欢4行信息寻找:
(daemon,*,1,1,System Services,/var/root,/usr/bin/false) (uucp,*,,,/var/spool/uucp,/usr/sbin/uucico) (taskgated,*,13,13,Task Gate Daemon,/var/empty,/usr/bin/false) (networkd,*,24,24,Network Services,/var/empty,/usr/bin/false) (installassistant,*,25,25,/usr/bin/false)
grunt>
--->显然如果它有错误,很好的信息有用,但不是当它基本上工作得很好.
考虑以下关系
test = LOAD 'input' USING PigStorage(',') as (a:chararray, b:chararray);
Run Code Online (Sandbox Code Playgroud)
有没有办法实现以下目标
if (b == 1) {
a = 'abc';
else if (b == 2) {
a = 'xyz';
else
// retain whatever is there in the column 'a'
Run Code Online (Sandbox Code Playgroud) 让我说JOIN两个关系如下:
-- part looks like:
-- 1,5.3
-- 2,4.9
-- 3,4.9
-- original looks like:
-- 1,Anju,3.6,IT,A,1.6,0.3
-- 2,Remya,3.3,EEE,B,1.6,0.3
-- 3,akhila,3.3,IT,C,1.3,0.3
jnd = JOIN part BY $0, original BY $0;
Run Code Online (Sandbox Code Playgroud)
输出将是:
1,5.3,1,Anju,3.6,IT,A,1.6,0.3
2,4.9,2,Remya,3.3,EEE,B,1.6,0.3
3,4.9,3,akhila,3.3,IT,C,1.3,0.3
Run Code Online (Sandbox Code Playgroud)
请注意,$0每个元组中显示两次.例如:
1,5.3,1,Anju,3.6,IT,A,1.6,0.3
^ ^
|-----|
Run Code Online (Sandbox Code Playgroud)
我可以通过执行以下操作手动删除重复键:
jnd = foreach jnd generate $0,$1,$3,$4 ..;
Run Code Online (Sandbox Code Playgroud)
有没有办法动态删除它?喜欢remove(the duplicate key joiner).
我是猪的新手.我试图找出如何使用硬编码值定义包或元组,而无需从文件加载数据.我遇到的每个例子都以:
a = LOAD'/ file/name'使用PigStorage(',');
或类似的东西.我只想创建一个这样的元组或包:
a = <1,2,3>;
是否可以将硬编码值用于测试目的?
谢谢.