将GUID类型字符串转换为VertexID类型Long,使用Pig中的存钱罐HashFNV



我在Hadoop中存储了2个文本文件,我想用它来在Apache Spark GraphX中创建Graph:

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

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

我的理解是:

  • 在 GraphX 中,VertexID 的类型为 Long。
  • 使用 String 作为 VertexId 的功能请求在 Apache Spark GraphX 开发人员社区中发出:https://issues.apache.org/jira/browse/SPARK-3799

为了继续我的项目,我想根据 GUID 信息(Long 类型)使用其他列扩展我的 2 个表,以便在 GraphX 中实现顶点 ID。Pig 不提供像 Java 那样的 UUID.getMostSignificantBits() 等函数来将 UUID/GUID 转换为 Long 类型。

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

问题:

  1. 正在使用Pig和执行HashFNV函数的存钱罐一种可用且实用的方法,用于生成 Long 类型的顶点包含 GUID 信息的输入表/文件?
  2. 注册存钱罐罐后,如何在 Pig 中调用和使用 HasFNV 函数?你能提供示例代码吗?

假设:

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

答案是以下 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 类型长的解决方案。我注意到其他想要使用自己的数据尝试Apache Spark GraphX的人也遇到了同样的问题。

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

最新更新