使用 Apache Hadoop Pig 内连接两个数据集

Posted

技术标签:

【中文标题】使用 Apache Hadoop Pig 内连接两个数据集【英文标题】:Inner join two data sets using Apache Hadoop Pig 【发布时间】:2015-08-31 23:17:33 【问题描述】:

我有两个数据集(1M 唯一字符串)和(1B 唯一字符串);我想知道两组共有多少个字符串,想知道使用 Apache Pig 获取数字的最有效方法是什么?

【问题讨论】:

【参考方案1】:

您可以先加入两个文件,如下所示:

A = LOAD '/joindata1.txt' AS (a1:int,a2:int,a3:int);
B = LOAD '/joindata2.txt' AS (b1:int,b2:int);
X = JOIN A BY a1, B BY b1;  

然后你可以统计行数:

grouped_records = GROUP X ALL;
count_records = FOREACH grouped_records GENERATE COUNT(A.a1);

它对你的问题有帮助吗...

【讨论】:

@LinMa 如果这回答了您的问题,请接受。【参考方案2】:

您的案例不属于复制、合并或倾斜联接。所以你必须做一个默认连接,在映射阶段它注释每个记录的源,连接键将用作随机键,以便相同的连接键进入同一个减速器,然后最左边的输入缓存在减速器端的内存中另一个输入被传递以进行连接。您还可以通过正常的连接优化来改进您的连接,例如在连接之前过滤 NULL,并且每个键的元组数量最多的表可以保留为查询中的最后一个表。

【讨论】:

为什么在我的情况下它不属于复制或合并或倾斜连接? 如果您必须进行复制连接,那么您的一个数据集的 KB 必须很小,以便可以将其发送到所有任务跟踪器,并缓存在内存和您的其他数据集中将通过进行加入。但是在这里,您的数据集似乎都不小。如果您对特定键有多个值,而单个 reducer 无法保存更多数据,则将使用倾斜连接。但是在这里,您的数据集包含唯一的字符串值。如果您的数据集已排序,则可以使用合并连接。 什么是合并连接?您能否分享一些关于 Skewed join 内部工作原理的文档? 小数据集的大小可以是几 MB,这完全取决于为 YARN 容器分配了多少内存,请尝试复制连接,如果您没有遇到与内存相关的异常,则一切都很好。你也可以使用布隆过滤器,见integralads.com/tech-corner/pig-and-joining-data【参考方案3】:

如果您的数据已经在两个数据集中排序,您可以定义merged join

Mergede = join A by a1, B by b1 USING "merge";

Skewed Join: If the data is skewed and user need finer control over the allocation to reducers.

skewedh = join A by a1, B by b1 USING "skewed";

【讨论】:

想知道如何将偏斜连接工作在偏斜数据场景下?谢谢。

以上是关于使用 Apache Hadoop Pig 内连接两个数据集的主要内容,如果未能解决你的问题,请参考以下文章

大数据Hadoop生态圈:Pig和Hive

如何使用 apache pig 在 hadoop 集群上加载文件?

PIG - 找到接口 org.apache.hadoop.mapreduce.JobContext,但预期类

Pig 0.13 错误 2998:未处理的内部错误。 org/apache/hadoop/mapreduce/task/JobContextImpl

Apache pig 错误 org.apache.pig.backend.hadoop.executionengine.Launcher - 错误:org.apache.avro.file.DataF

PIG 自动与默认 HDFS 连接,如何?