我在Hadoop中存储了2个文本文件,我想用它来在Apache Spark GraphX中创建Graph:
- 包含顶点信息的文本文件,包括 GUID 类型字符串标识每个顶点。
- 包含边缘信息的文本文件,包括链接源和目标顶点 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 列的新表。
问题:
- 正在使用Pig和执行HashFNV函数的存钱罐一种可用且实用的方法,用于生成 Long 类型的顶点包含 GUID 信息的输入表/文件?
- 注册存钱罐罐后,如何在 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 的地址空间有限。