在猪中计数并压平

Posted

技术标签:

【中文标题】在猪中计数并压平【英文标题】:Count and flatten in pig 【发布时间】:2014-08-25 23:56:39 【问题描述】:

您好,我有这样的数据:

“user_id”:“kim95”,“type”:“Book”,“title”:“现代数据库系统:对象模型、互操作性和超越。”、“year”:“1995”、“publisher” ": "ACM Press and Addison-Wesley", "authors": ["name":"null"], "source": "DBLP"

“user_id”:“marshallo79”,“type”:“Book”,“title”:“不等式:大写理论及其应用。”,“year”:“1979”,“publisher”:“Academic Press", "authors": ["name":"Albert W. Marshall","name":"Ingram Olkin"], "source": "DBLP"

"user_id": "knuth86a", "type": "Book", "title": "TeX: The Program", "year": "1986", "publisher": "Addison-Wesley", "作者": ["name":"Donald E. Knuth"], "来源": "DBLP" ...

我想获取出版商、标题,然后对组应用计数,但我收到错误“列需要...”使用此脚本:

books = load 'data/book-seded-workings-reduced.json'
    using JsonLoader('user_id:chararray,type:chararray,title:chararray,year:chararray,publisher:chararray,authors:(name:chararray),source:chararray');

doc = group books by publisher;
res = foreach doc generate group,books.title,count(books.publisher);
DUMP res;    

在第二个查询中,我希望有这样的结构:(name,year),title

所以我尝试了这个:

books = load 'data/book-seded-workings-reduced.json'
    using JsonLoader('user_id:chararray,type:chararray,title:chararray,year:chararray,publisher:chararray,authors:(name:chararray),source:chararray');


flat =group books by (generate FLATTEN((authors.name),year);
tab = foreach flat generate group, books.title;
DUMP tab;

但它也不起作用......

有什么想法吗?

【问题讨论】:

你能更清楚你期望的输出是什么 对于第一个,我喜欢这样的输出:出版商、标题和同一出版商在我的文件中加载的次数 第二个我想要一个 authirs 的每个名字的列表以及一组年份......然后是书名 所以像(name,year)在组中并为每个元组生成与该组链接的标题:(name,year),title 【参考方案1】:

您在尝试第一个查询时遇到什么错误? 内置函数 COUNT 必须全部大写,不能调用 COUNT(group),group 是 Pig 生成的内部标识符。

我在运行您的第一个查询时得到以下结果 -

(学术出版社,(不等式:专业化理论及其应用。),1) (Addison-Wesley,(TeX: The Program),1) (ACM Press 和 Addison-Wesley,(现代数据库系统:对象模型、互操作性及其他),1)

(name,year)的预期格式,title也可以这样实现-

flat = foreach books generate FLATTEN(authors.name) as authorName, year, title;
tab = group flat by (authorName, year);
finaltab = foreach tab generate group, flat.title;

【讨论】:

对不起,我现在不能告诉你我的错误我没有我的笔记本电脑在我的眼前....对于第一个脚本,你使用了我的脚本吗?奇怪的是它对你有用。 ..您可以重试相同的脚本,但通过在文件中添加一个或多个具有相同名称的发布者的元组以及您希望其他字段的任何内容来确保可以吗?稍后我会发布我的错误...非常感谢您提供第二个脚本 我在 COUNT 大写的情况下再次对其进行了测试,它可以正常工作....我不能在 COUNT 中调用组是什么意思?因为脚本有效...感谢第二个【参考方案2】:

我能看到的第一个代码中唯一的问题是“COUNT”而不是 count(大写)

如果你使用没有大写计数,那么你会得到一个错误

无法使用导入解析计数:

【讨论】:

以上是关于在猪中计数并压平的主要内容,如果未能解决你的问题,请参考以下文章

MySql 的行数并插入到计数的表中

在 PySpark Dataframe 中计数零次出现

在python中计数最高的打印件

在 spark 1.6 中计数(不同)不能与 hivecontext 查询一起使用

按小时计算行数并包含零

使用 yield 压平多层嵌套字典列表混合数据