0

我有 2 个文本文件存储在 Hadoop 中,我想用它们在 Apache Spark GraphX 中创建一个图形:

  1. 具有顶点信息的文本文件,包括标识每个顶点的 GUID 类型字符串。
  2. 带有边缘信息的文本文件,包括两个 GUID 类型的字符串,用于链接源顶点和目标顶点 GUID。

我将这些表文件导入到 HCatalog 表中,这样我就可以使用 HiveContext 从 Spark 访问这些文件。

我的理解是:

为了继续我的项目,我想根据 GUID 信息,用 Long 类型的附加列扩展我的 2 个表,以便在 GraphX 中实现 VertexID。Pig 不提供诸如 Java 中的 UUID.getMostSignificantBits() 之类的函数来将 UUID/GUID 转换为 Long 类型。

Piggybank UDF 在“评估”部分包含函数 HashFNV 的实现。虽然我不是 Java 开发人员,但我从 Java 源代码中了解到,该函数转换 String 类型的输入并返回 Long 类型的哈希。它还将输入表扩展为具有 DataType.LONG 列的新表。

问题:

  1. 将 Pig 与执行 HashFNV 函数的 Piggybank jar 一起使用是一种实用且实用的方法,可以从具有 GUID 信息的输入表/文件生成 Long 类型的 VertexIds?
  2. 注册 Piggybank jar 后,如何在 Pig 中调用和使用 HasFNV 函数?你能提供示例代码吗?

假设:

  • 唯一的 GUID 将使用 HashFNV 生成 Long 类型的唯一哈希。
  • 我确实理解代表 128 位的 GUID 不适合 64 位的 Long。但是,输入文件中的 GUID 数量不会超过 64 位空间。
4

1 回答 1

0

答案是以下 Pig 脚本:

REGISTER piggybank.jar;
A = LOAD '/user/hue/guidfile.txt'
AS (guid:chararray, name:chararray, label:chararray);
B = FOREACH A GENERATE (guid, name, label, org.apache.pig.piggybank.evaluation.string.HashFNV(guid));
store B INTO '/user/hue/guidlongfile.txt';

结果包括一个 Long 类型的附加字段。

提到名称和标签字段以指示除 GUID 字段外还具有名称和标签属性的顶点类型表。它们在答案中没有任何作用。

看起来我找到了一种从字符串类型 GUID 生成 VertexIds 类型 Long 的解决方案。我注意到其他想要使用自己的数据来试验 Apache Spark GraphX 的人也遇到了同样的问题。

如果您想复制解决方案:请注意 64 位类型 Long 的有限地址空间与 128 位 GUID 相比。

于 2015-02-03T23:04:48.363 回答