Pig面试问题

21-12-23 banq

你能给我们举一些例子来说明 Hadoop 在实时环境中是如何使用的吗?
假设我们有一个由 10 道选择题组成的考试,20 名学生参加了该考试。每个学生都会尝试每个问题。对于每个问题和每个答案选项,都会生成一个密钥。因此,我们为每个学生的所有问题和所有答案选项提供了一组键值对。根据学生选择的选项,您必须分析并找出有多少学生回答正确。
这不是一件容易的事。在这里 Hadoop 出现了!Hadoop 可以帮助您快速、轻松地解决这些问题。您还可以考虑有多少学生错误地尝试了特定问题。
 

BloomMapFile 有什么用?
BloomMapFile 是一个扩展 MapFile 的类。所以它的功能类似于 MapFile。
BloomMapFile 使用动态布隆过滤器为键提供快速的成员资格测试。它以 Hbase 表格式使用。

 
什么是Pig?

PIG是一个用于分析大型数据集的平台,它由用于表达数据分析程序的高级语言以及用于评估这些程序的基础设施组成。PIG 的基础设施层由生成 MapReduce 程序序列的编译器组成。
 

逻辑计划和物理计划有什么区别?
当Pig Latin Script转换为 MapReduce 作业时,Pig 会经历一些步骤。在执行基本的解析和语义检查后,它会生成一个逻辑计划。逻辑计划描述了 Pig 在执行期间必须执行的逻辑运算符。在此之后,Pig 生成了一个物理计划。物理计划描述了执行脚本所需的物理操作符。
 

'ILLUSTRATE' 是否运行 MR 作业?
不,图解不会拉任何 MR,它会拉内部数据。在控制台上,说明不会做任何工作。它只显示每个阶段的输出,而不是最终输出。
 

关键字“DEFINE”是否像函数名?
是的,关键字“DEFINE”就像一个函数名。注册后,您必须定义它。无论您在 Java 程序中编写了什么逻辑,您都有一个导出的 jar 和一个由您注册的 jar。现在编译器将检查导出的 jar 中的函数。当库中不存在该函数时,它会查看您的 jar。
 

关键字“FUNCTIONAL”是用户定义函数 (UDF) 吗?
不,关键字“FUNCTIONAL”不是用户定义的函数 (UDF)。在使用 UDF 时,我们必须覆盖一些函数。当然,您只能借助这些功能来完成您的工作。但是关键字“FUNCTIONAL”是内置函数,即预定义函数,因此它不能作为 UDF 工作。
 

为什么我们在 Pig 编程时需要 MapReduce?
Pig 是一个高级平台,它使许多 Hadoop 数据分析问题更容易执行。我们在这个平台上使用的语言是:Pig Latin。用 Pig Latin 编写的程序就像用 SQL 编写的查询,我们需要一个执行引擎来执行查询。所以,当一个程序用 Pig Latin 编写时,Pig 编译器会将程序转换为 MapReduce 作业。在这里,MapReduce 充当执行引擎。
 

有没有什么问题只能用MapReduce解决,PIG不能解决?在哪些场景中 MR 作业会比 PIG 更有用?
让我们假设一个场景,我们要计算两个城市的人口。我有不同城市的数据集和传感器列表。我想通过对两个城市使用一个 mapreduce 来计算人口。让我们假设一个是班加罗尔,另一个是诺伊达。所以我需要考虑类似于诺伊达的班加罗尔市的key,通过它我可以将这两个城市的人口数据带到一个reducer。这背后的想法是我必须如何指导 map reducer 程序——每当你找到名为“班加罗尔”的城市和名为“诺伊达”的城市时,你创建别名,这将是这两个城市的通用名称,所以您为两个城市创建了一个公共密钥,并将其传递给同一个减速器。为此,我们必须编写自定义分区程序。
在 mapreduce 中,当您为城市创建“键”时,您必须将“城市”视为键。因此,每当框架遇到不同的城市时,它都会将其视为不同的密钥。因此,我们需要使用自定义的分区器。仅在 mapreduce 中有一项规定,您可以在其中编写自定义分区程序并提及 city = bangalore 或 noida,然后传递类似的哈希码。但是,我们无法在 Pig 中创建自定义分区器。由于 Pig 不是框架,我们无法直接执行引擎自定义分区器。在这种情况下,MapReduce 比 Pig 更有效。
 

当存在类型不匹配或缺少字段时,Pig 是否会发出任何警告?
不,如果没有匹配的字段或不匹配,Pig 不会显示任何警告。如果假设 Pig 给出了这样的警告,那么很难在日志文件中找到。如果发现任何不匹配,则在 Pig 中假定为空值。
 

Pig 中的什么合作组?
Co-group 通过仅对一个特定数据集进行分组来加入数据集。它按元素的公共字段对元素进行分组,然后返回一组包含两个单独包的记录。第一个包由第一个数据集和公共数据集的记录组成,第二个包由第二个数据集和公共数据集的记录组成。
 

我们可以说 cogroup 是一组多于 1 个数据集吗?
Cogroup 是一组一个数据集。但是对于多个数据集的情况,cogroup 会将所有数据集分组,并根据公共字段将它们连接起来。因此,我们可以说 cogroup 是一组多个数据集以及该数据集的连接。
 

FOREACH 是做什么的?
FOREACH 用于对数据应用转换并生成新的数据项。名称本身表明对于数据包的每个元素,将执行相应的操作。
语法: FOREACH bagname GENERATE expression1, expression2, .....
这条语句的意思是GENERATE后面提到的表达式会应用到数据包的当前记录上。
 

什么是包?
包是 Pig 中存在的数据模型之一。它是一个无序的元组集合,可能有重复。袋子用于在分组时存放收藏品。bag 的大小是本地磁盘的大小,这意味着 bag 的大小是有限的。当包已满时,Pig 会将这个包溢出到本地磁盘中,并且只保留包的某些部分在内存中。没有必要将完整的包放入内存中。我们用“{}”代表包。