如何检查元组是不是包含 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 中的元素?的主要内容,如果未能解决你的问题,请参考以下文章
如果存在多个值,Apache Pig Group by 和过滤器?