Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何实现或加入hadoop(滚烫/层叠)_Scala_Join_Hadoop_Cascading_Scalding - Fatal编程技术网

Scala 如何实现或加入hadoop(滚烫/层叠)

Scala 如何实现或加入hadoop(滚烫/层叠),scala,join,hadoop,cascading,scalding,Scala,Join,Hadoop,Cascading,Scalding,只需将连接字段作为一个减缩键发送,就可以通过单个键轻松地连接数据集。 但是通过多个键连接记录,其中至少有一个键应该是相同的,这对我来说并不容易 示例我有日志,我想按用户参数对它们进行分组,我想通过(ipAddress、sessionId、visitorCockies)加入它们 因此,如果log1.ip==log2.ip或log1.session=log2.session或log1.cockie=log2.coockie,则应将log1与log2分组。也许可以创建复合密钥或一些概率方法,如minH

只需将连接字段作为一个减缩键发送,就可以通过单个键轻松地连接数据集。 但是通过多个键连接记录,其中至少有一个键应该是相同的,这对我来说并不容易

示例我有日志,我想按用户参数对它们进行分组,我想通过(ipAddress、sessionId、visitorCockies)加入它们

因此,如果log1.ip==log2.ip或log1.session=log2.session或log1.cockie=log2.coockie,则应将log1与log2分组。也许可以创建复合密钥或一些概率方法,如minHash


可能吗

问题在于,MapReduce连接通常是通过为某些字段上匹配的记录提供相同的reduce键来实现的,以便将它们发送到相同的reducer。所以任何绕过这一点的方法都会有点麻烦,但这是可能的

以下是我的建议:对于每个输入记录,生成三个副本,每个副本都有一个新的“key”字段,该字段的前缀是它来自的字段。例如,假设您有以下输入:

(ip=1.2.3.4, session=ABC, cookie=123)
(ip=3.4.5.6, session=DEF, cookie=456)
然后你会产生

(ip=1.2.3.4, session=ABC, cookie=123, key=ip_1.2.3.4)
(ip=1.2.3.4, session=ABC, cookie=123, key=session_ABC)
(ip=1.2.3.4, session=ABC, cookie=123, key=cookie_123)
(ip=3.4.5.6, session=DEF, cookie=456, key=ip_3.4.5.6)
(ip=3.4.5.6, session=DEF, cookie=456, key=session_DEF)
(ip=3.4.5.6, session=DEF, cookie=456, key=cookie_456)
然后你就可以在这个新领域进行分组了


我对滚烫/级联不太熟悉(尽管我一直想了解更多),但这肯定符合Hadoop中通常执行连接的方式。

问题是,MapReduce连接通常是通过为某些字段上匹配的记录提供相同的reduce键来实现的,以便将它们发送到相同的reducer。所以任何绕过这一点的方法都会有点麻烦,但这是可能的

以下是我的建议:对于每个输入记录,生成三个副本,每个副本都有一个新的“key”字段,该字段的前缀是它来自的字段。例如,假设您有以下输入:

(ip=1.2.3.4, session=ABC, cookie=123)
(ip=3.4.5.6, session=DEF, cookie=456)
然后你会产生

(ip=1.2.3.4, session=ABC, cookie=123, key=ip_1.2.3.4)
(ip=1.2.3.4, session=ABC, cookie=123, key=session_ABC)
(ip=1.2.3.4, session=ABC, cookie=123, key=cookie_123)
(ip=3.4.5.6, session=DEF, cookie=456, key=ip_3.4.5.6)
(ip=3.4.5.6, session=DEF, cookie=456, key=session_DEF)
(ip=3.4.5.6, session=DEF, cookie=456, key=cookie_456)
然后你就可以在这个新领域进行分组了


我对滚烫/级联不太熟悉(尽管我一直想了解更多),但这肯定符合Hadoop中通常的连接方式。

在创建了Joe所描述的单独连接之后,需要消除重复的连接。如果数据中的两个元组在“或联接”中使用的所有字段中相等,则它们是重复的。因此,如果在表示所有相关字段的键上进行自然联接,则会将所有重复项分组在一起。因此,可以用相应元组的单个匹配项替换它们


让我们看一个例子:假设有一个元组,其中包含字段(A、B、C、D),而您感兴趣的字段是A、B和C。首先分别对A、B和C进行等联接。对于每一个,您都要将初始元组流与其自身连接起来。用(A0、B0、C0、D0)表示第一个流,用(A1、B1、C1、D1)表示第二个流。结果将是元组(A0、B0、C0、D0、A1、B1、C1、D1)。对于这些元组中的每个元组,您将创建一个元组(A0A1B0B1C0C1、A0、B0、C0、D0、A1、B1、C1、D1),因此所有重复项都将在后续的缩减器中分组。对于每个组,只返回包含的元组中的一个。

在按照上面Joe的描述创建了单独的连接之后,需要除去重复的元组。如果数据中的两个元组在“或联接”中使用的所有字段中相等,则它们是重复的。因此,如果在表示所有相关字段的键上进行自然联接,则会将所有重复项分组在一起。因此,可以用相应元组的单个匹配项替换它们


让我们看一个例子:假设有一个元组,其中包含字段(A、B、C、D),而您感兴趣的字段是A、B和C。首先分别对A、B和C进行等联接。对于每一个,您都要将初始元组流与其自身连接起来。用(A0、B0、C0、D0)表示第一个流,用(A1、B1、C1、D1)表示第二个流。结果将是元组(A0、B0、C0、D0、A1、B1、C1、D1)。对于这些元组中的每个元组,您将创建一个元组(A0A1B0B1C0C1、A0、B0、C0、D0、A1、B1、C1、D1),因此所有重复项都将在后续的缩减器中分组。对于每个组,只返回包含的元组中的一个。

您能否描述有关“通过多个键连接记录”的更多信息

如果您知道工作流中可以连接特定键的点,那么最好的方法可能是定义一个具有多个连接的流,而不是尝试在一个步骤中为要解析的N个键操作复杂的数据结构


下面是一个示例应用程序,它展示了如何在级联中处理不同类型的连接:

您能描述更多关于“通过多个键连接记录”的信息吗

如果您知道工作流中可以连接特定键的点,那么最好的方法可能是定义一个具有多个连接的流,而不是尝试在一个步骤中为要解析的N个键操作复杂的数据结构


下面是一个示例应用程序,它展示了如何在级联中处理不同类型的连接:

对于级联,我最终创建了一个过滤器,用于检查内部条件的输出是否为真。级联过滤器输出可以选择使用的真/假值

对于级联,我最终创建了一个过滤器,用于检查内部条件的输出是否正确。级联过滤器输出可以选择使用的真/假值

提示:使用类型别名使您的代码易于阅读

注意0:此解决方案特别好,因为它始终只是一个映射作业,即使有更多的键加入

注意1:假设每个管道没有重复的键,否则您必须使“键”也有一个它来自哪个日志的索引,而mapTo将是一个flatMapTo,并且有点复杂

注意2:为了简单起见,这将丢弃连接字段,为了保留它们,您需要一个大的丑陋元组(ip1、ip2、session1、session2