2016-11-15 41 views
3

LOAD函数/命令从HDFS或本地FS加载数据。 例如: - 这猪命令可以执行在引擎盖下? PIG在哪里保存中间结果/关系数据?

gurnt >employees = LOAD 'hdfs://localhost:9090/pig_dir/data.txt' USING PigStorage(',') as (id:int, salary:int, ...etc) 

关注 - 像

grunt >wellpaid_employees = FILTER employees BY salary > '100000'; 

于是我开始思考,哪里猪存储“雇员”数据/关系。当需要进一步处理时使用,即生成wellpaid_employees
1)员工关系 - 如果只是将员工保存在临时目录(基于配置)中,有什么好处。它可以以任何方式每次从HDFS读取数据。该文件可以从1GB到1TB甚至更大。所以我会假设LOAD不会在其他地方复制数据。它懒散地工作。它使用HDFS中的原始文件来运行猪作业(这是屏幕后面的MR作业)。
2)wellpaid_employees关系 - 当猪过程员工关系产生wellpaid_employees关系。它在哪里保存这个结果。 因为,如果我必须做“wellpaid_employees”进一步处理想获得的所有高薪员工在一个特定的城市 - 例如

grunt >wellpaid_employees_in_newyork = FILTER wellpaid_employees BY city == 'NY'; 

在这种情况下,我看到PIG的存储benfit所有的中间和最终结果/关系一些地方。这是猪的工作原理吗?

那么如何(格式等)和地方(物理位置)不养猪存储中间结果/关系,以及如何配置这些方面?

但是,如果中间结果也太大 - 比如几GB,那么折衷工作(每次处理先前的阶段或存储结果之间)是如何工作的。它也可以配置。

+1

猪将保存在内存中的关系,直到用完。然后它溢出到磁盘。但它不存储关系,没有什么是永久的。除非您主动存储它,否则您不能在另一个Pig作业中访问它。 – Andrew

回答

2

所有的转化都懒,因为它们不计算其结果的时候了。除了在DUMP和STORE中,以及在所有其他命令中,它只评估错误的语法。

而且statments是在存储器和execite为了一次动作(sotre /转储)被使用。

+0

如果关系(wellpaid_employees)被存储在HDFS然后另一关系(wellpaid_employees_in_newyork)是基于先前的关系进行处理。然后,猪会智能地拾取存储的文件进行进一步处理,或整个链再次处理(员工 - > wellpaid_employees - > wellpaid_employees_in_newyork)。 (我看到有很多的MapReduce涉及发动机罩下的。因此,没有猪产生它使用保存的文件或刚刚生成可以放火的每一件事情一个MR工作MR工作) – samshers

+0

我的理解,将所有的方式回到第一个关系,你可以试一试,如果你做LOAD - > Filter - > FOREACH,并且首先LOAD有一个错误的目录路径,它不会抱怨,直到你运行dump或store, –