如何检查元组是不是包含 Apache Pig 中的元素?

Posted

技术标签:

【中文标题】如何检查元组是不是包含 Apache Pig 中的元素?【英文标题】:How to check if a tuple contains an element in Apache Pig?如何检查元组是否包含 Apache Pig 中的元素? 【发布时间】:2021-05-19 14:40:56 【问题描述】:

假设我有这个文件:

movie_id,title,genres
95004,Superman/Doomsday (2007),Action|Animation
136297,Mortal Kombat: The Journey Begins (1995),Action
193565,Gintama: The Movie (2010),Action|Animation|Comedy|Sci-Fi
193573,Love Live! The School Idol Movie (2015),Animation

我是这样加载的:

movies = LOAD 'movies.csv' USING PigStorage(',') AS (moviesId:int, title:chararray, genres: chararray);
movies = FOREACH movies GENERATE movieId, title, STRSPLIT(genres,'\\|') as genres;
describe a;       //a: movieId: int,title: chararray,genres: ()

dump a 结果示例:

...
(193581,Black Butler: Book of the Atlantic (2017),(Action,Animation,Comedy,Fantasy))
(193583,No Game No Life: Zero (2017),(Animation,Comedy,Fantasy))
...

现在,如果我没有正确理解,字段流派是元组类型。问题是如何进行查询,例如:“获取所有动作片?”。我不知道如何检查元组类型中是否存在特定元素。

我知道如何使用 Python UDF 函数来做到这一点,但我想知道如果没有它是否可能。也许我应该以不同的方式加载文件。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

如果您愿意将流派放入一个包而不是一个元组(我认为这会更合适,因为流派的数量因记录而异)。这可以通过嵌套的FOREACH 来解决,方法是过滤特定类型的包,然后测试包是否为空。

movies = LOAD 'movies.csv' USING PigStorage(',') AS (moviesId:int, title:chararray, genres: chararray);
moviesSplit = FOREACH movies GENERATE movieId, title, TOKENIZE(genres,'|') as genres;

actionTest = FOREACH moviesSplit 
    action = FILTER genres by $0 == 'Action';
    GENERATE *, action;

actionMovies = FILTER actionTest BY NOT IsEmpty(action);

【讨论】:

以上是关于如何检查元组是不是包含 Apache Pig 中的元素?的主要内容,如果未能解决你的问题,请参考以下文章

在 Pig 中对元组中的所有字段应用 TRIM()

如果存在多个值,Apache Pig Group by 和过滤器?

将键值元组包转换为 Apache Pig 中的映射

apache pig Java UDF - 更改属性中的值似乎并没有坚持

在 Apache Pig 中为元组创建模式

Apache Pig GROUP BY ,ORDER BY