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 循环中过滤第二个数据源)

Pig UDF 或 Pig Latin 还是两者兼而有之?

如何在 Pig Latin 中进行“总结”?

如何在 Pig Latin 中每行加载一个带有 JSON 数组的文件

聚合的 Pig Latin 逻辑测试