在 Pig 中使用 Piggybank HashFNV 将 GUID 类型 String 转换为 VertexIDs 类型 Long
Conversion of GUID type String to VertexIDs type Long using Piggybank HashFNV in Pig
我在 Hadoop 中存储了 2 个文本文件,我想用它们在 Apache Spark GraphX 中创建图形:
- 一个包含顶点信息的文本文件,包括一个 GUID 类型的字符串
识别每个顶点。
- 一个包含边缘信息的文本文件,包括两个 GUID 类型字符串,链接源和目标顶点 GUID。
我将这些 tables 文件导入 HCatalog tables,这样我就可以使用 HiveContext 从 Spark 访问这些文件。
我的理解是:
- 在 GraphX 中,VertexID 是 Long 类型。
- 在 Apache Spark GraphX 开发者社区中发出了使用字符串作为 VertexId 的功能请求:
https://issues.apache.org/jira/browse/SPARK-3799
为了继续我的项目,我想根据 GUID 信息,使用 Long 类型的附加列扩展我的 2 table,以便在 GraphX 中实现 VertexID。 Pig 不提供 UUID.getMostSignificantBits() 之类的函数,如 Java 中那样将 UUID/GUID 转换为 Long 类型。
Piggybank UDF 在 "evaluation" 部分包含函数 HashFNV 的实现。
虽然我不是 java 开发人员,但我从 java 源代码了解到该函数转换 String 类型的输入和 returns Long 类型的散列。它还将输入 table 扩展为一个新的 table,其列为 DataType.LONG.
问题:
- 正在使用 Pig 和 Piggybank jar 执行 HashFNV 函数
从中生成 Long 类型的 VertexIds 的可用且实用的方法
带有 GUID 信息的输入 table/file?
- 注册Piggybank jar后如何在Pig中调用和使用HasFNV函数?你能提供示例代码吗?
假设:
- 唯一的 GUID 将导致使用 HashFNV 的 Long 类型的唯一哈希。
- 我知道表示 128 位的 GUID 不适合 64 位的 Long。但是,输入文件中的 GUID 数量不会超过 64 位 space.
答案是以下 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 字段外,还提到名称和标签字段以指示具有名称和标签属性的顶点类型 table。它们在答案中没有任何作用。
看来我找到了从字符串类型 GUID 生成 VertexIds 类型 Long 的解决方案。我注意到其他想要使用自己的数据试验 Apache Spark GraphX 的人遇到了同样的问题。
如果您想复制解决方案:请注意与 128 位 GUID 相比,64 位类型 Long 的有限地址 space。
我在 Hadoop 中存储了 2 个文本文件,我想用它们在 Apache Spark GraphX 中创建图形:
- 一个包含顶点信息的文本文件,包括一个 GUID 类型的字符串 识别每个顶点。
- 一个包含边缘信息的文本文件,包括两个 GUID 类型字符串,链接源和目标顶点 GUID。
我将这些 tables 文件导入 HCatalog tables,这样我就可以使用 HiveContext 从 Spark 访问这些文件。
我的理解是:
- 在 GraphX 中,VertexID 是 Long 类型。
- 在 Apache Spark GraphX 开发者社区中发出了使用字符串作为 VertexId 的功能请求: https://issues.apache.org/jira/browse/SPARK-3799
为了继续我的项目,我想根据 GUID 信息,使用 Long 类型的附加列扩展我的 2 table,以便在 GraphX 中实现 VertexID。 Pig 不提供 UUID.getMostSignificantBits() 之类的函数,如 Java 中那样将 UUID/GUID 转换为 Long 类型。
Piggybank UDF 在 "evaluation" 部分包含函数 HashFNV 的实现。 虽然我不是 java 开发人员,但我从 java 源代码了解到该函数转换 String 类型的输入和 returns Long 类型的散列。它还将输入 table 扩展为一个新的 table,其列为 DataType.LONG.
问题:
- 正在使用 Pig 和 Piggybank jar 执行 HashFNV 函数 从中生成 Long 类型的 VertexIds 的可用且实用的方法 带有 GUID 信息的输入 table/file?
- 注册Piggybank jar后如何在Pig中调用和使用HasFNV函数?你能提供示例代码吗?
假设:
- 唯一的 GUID 将导致使用 HashFNV 的 Long 类型的唯一哈希。
- 我知道表示 128 位的 GUID 不适合 64 位的 Long。但是,输入文件中的 GUID 数量不会超过 64 位 space.
答案是以下 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 字段外,还提到名称和标签字段以指示具有名称和标签属性的顶点类型 table。它们在答案中没有任何作用。
看来我找到了从字符串类型 GUID 生成 VertexIds 类型 Long 的解决方案。我注意到其他想要使用自己的数据试验 Apache Spark GraphX 的人遇到了同样的问题。
如果您想复制解决方案:请注意与 128 位 GUID 相比,64 位类型 Long 的有限地址 space。