Pig Latin 在一个 FILTER 语句中使用两个数据源
Posted
技术标签:
【中文标题】Pig Latin 在一个 FILTER 语句中使用两个数据源【英文标题】:Pig Latin using two data sources in one FILTER statement 【发布时间】:2014-06-20 11:53:31 【问题描述】:在我的猪脚本中,我从超过 5 个数据源(Hive 表)中读取数据,其中一个是主要源数据,其余是维度数据表。我正在尝试过滤主要数据源关系(或别名)w.r.t 在一个维度关系中的某个值。
例如
-- main_data is main data source and dept_data is department data
filtered_data1 = FILTER main_data BY deptID == dept_data.departmentID;
filtered_data2 = FOREACH filtered_data1 GENERATE $0, $1, $3, $7;
在我的猪脚本中,至少有 20 个实例需要匹配多个数据源之间的某个值并生成新关系。但是我遇到了一些错误
错误 org.apache.pig.tools.grunt.Grunt - 错误 1066:无法打开别名过滤数据 1 的迭代器。 后端错误:标量在输出中有不止一行。第一个:(.....)第二个:(......) 日志文件中的详细信息:/root/pig_1403263965493.log
我也尝试使用“relation::field”方法,但没用。或者,我加入这两个关系(数据源)以获取过滤数据,但我觉得这会减慢执行过程,并且会转储不必要的大量数据。
请指导我两个如何在一个 FILTER 语句中使用两个或多个数据源,就像在 SQL 中一样,这样我就可以避免使用 JOIN 语句并从 FILTER 语句本身完成它。
Where A.deptID = B.departmentID And A.sectionID = C.sectionID And A.cityID = D.cityID
【问题讨论】:
这是不可能的。你必须做一个JOIN
。
是的 WinnieNicklaus,目前正在使用 JOIN,用于 20 多个代码块。寻找替代方法;如果可以通过 FILTER 本身获得....
对于在寻找ERROR 1066: Unable to open iterator for alias 时发现此帖子的人,这里是generic solution。
【参考方案1】:
如果您想通过单个 ID 匹配来自不同表的记录,您几乎必须使用连接,例如:
Where A::deptID = B::departmentID And A::sectionID = C::sectionID And A::cityID = D::cityID
如果您只想保留所有其他表中出现的记录,您可能会先选择INTERSECT
,然后再选择
FILTER BY someID IN someIDList
【讨论】:
以上是关于Pig Latin 在一个 FILTER 语句中使用两个数据源的主要内容,如果未能解决你的问题,请参考以下文章
我可以使用 Pig Latin 中的嵌套 FOREACH 语句生成嵌套包吗?
Pig Latin(在 foreach 循环中过滤第二个数据源)