我的数据处理中的一个常见模式是按一组列进行分组,应用过滤器,然后再次展平.例如:
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>;
是否可以将硬编码值用于测试目的?
谢谢.
有没有办法可以使用字段作为键来获取变量键的映射值?例如:我的公司数据具有这样的区域设置和名称字段
{"en_US", (["en_US" : "English Name"], ["fr_FR" : "French Name"])}
Run Code Online (Sandbox Code Playgroud)
我真正想要的是使用locale作为关键字获取地图的价值,因为不同的语言环境会有所不同.
company_data = load '/data' using PigStorage();
final_company_data = FOREACH company_data GENERATE
value.locale as locale
value.name#locale;
Run Code Online (Sandbox Code Playgroud)
以下给出了一个错误,因为我明白要从地图中检索一个值,我们需要value.name#'en_US'.有没有办法我们可以使用语言环境,以便取代正确的值?
Output : final_company_data = {"en_US", "English Name"}
Run Code Online (Sandbox Code Playgroud) 在本地运行PIG脚本和在mapreduce上运行PIG脚本有什么区别?我理解mapreduce模式是在安装了hdfs的集群上运行它.这是否意味着本地模式不需要HDFS,因此即使mapreduce作业也不会被触发?有什么区别,你什么时候对方?
Apache Pig中一个非常常见的错误消息是:
错误1066:无法打开别名的迭代器
有几个问题提到了这个错误,但没有一个提供处理它的通用方法.因此这个问题:
当你收到错误1066时该怎么办:无法打开别名的迭代器?