使用Pig中的Piggybank HashFNV将GUID类型字符串转换为VertexIDs类型为Long

时间:2015-02-02 06:45:16

标签: apache-pig spark-graphx

我有两个存储在Hadoop中的文本文件,我想用它们在Apache Spark GraphX中创建一个Graph:

  1. 包含顶点信息的文本文件,包括GUID类型字符串 识别每个顶点。
  2. 包含Edge信息的文本文件,包括两个GUID类型String,用于链接源和目标顶点GUID。
  3. 我将这些表文件导入HCatalog表,以便我可以使用HiveContext从Spark访问这些文件。

    我的理解是:

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

    Piggybank UDF包括"评估" section一个函数HashFNV的实现。 虽然我不是java开发人员,但我从java源代码中理解该函数转换String类型的输入并返回Long类型的哈希。它还将输入表扩展为具有DataType.LONG列的新表。

    问题:

    1. 使用Pig和Piggybank jar执行HashFNV功能 一种可用且实用的方法来生成Long类型的VertexIds 带有GUID信息的输入表/文件?
    2. 在注册Piggybank jar后,如何在Pig中调用和使用HasFNV功能?你能提供示例代码吗?
    3. 假设:

      • 唯一的GUID将导致使用HashFNV的Long类型的唯一哈希。
      • 我知道表示128位的GUID不适合长64位。但是,输入文件中的GUID数量不会超过64位空间。

1 个答案:

答案 0 :(得分: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字段之外,还提到了名称和标签字段,以指示具有名称和标签属性的Vertex类型表。他们在答案中没有任何作用。

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

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