在pig中使用piggybank hashfnv将guid类型字符串转换为vertexids类型long

busg9geu  于 2021-06-25  发布在  Pig
关注(0)|答案(1)|浏览(334)

我有两个存储在hadoop中的文本文件,我想用它们在apache spark graphx中创建一个图形:
包含顶点信息的文本文件,包括标识每个顶点的guid类型字符串。
包含边信息的文本文件,包括两个链接源和目标顶点guid的guid类型字符串。
我将这些表文件导入到hcatalog表中,以便使用hivecontext从spark访问这些文件。
我的理解是:
在graphx中,vertexid是long类型。
apache spark graphx开发人员社区发出了将字符串用作vertexid的功能请求:https://issues.apache.org/jira/browse/spark-3799
为了继续我的项目,我想在guid信息的基础上,用long类型的额外列扩展我的2个表,以便在graphx中实现vertexids。pig没有像java中那样提供uuid.getmostsignificantbits()之类的函数来将uuid/guid转换为long类型。
piggybank udf在“evaluation”部分中包含一个函数hashfnv的实现。虽然我不是java开发人员,但我从java源代码中了解到,该函数转换string类型的输入并返回long类型的散列。它还将输入表扩展到一个列为datatype.long的新表。
问题:
使用pig和piggybankjar执行hashfnv函数是一种实用的方法,可以从带有guid信息的输入表/文件生成long类型的vertexid吗?
注册piggybank jar之后,如何在pig中调用和使用hasfnv函数?你能提供示例代码吗?
假设:
唯一的guid将使用hashfnv生成long类型的唯一哈希。
我知道一个代表128位的guid不适合长的64位。但是,输入文件中的guid数量不会超过64位空间。

mrphzbgm

mrphzbgm1#

答案如下:

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字段外,name和label字段用于指示具有name和label属性的顶点类型表。它们在答案中没有作用。
看起来我找到了一个从字符串类型guid生成vertexids类型long的解决方案。我注意到,其他想使用自己的数据来试验apachespark graphx的人也遇到了同样的问题。
如果要复制解决方案:请注意与128位guid相比,64位类型的地址空间有限。

相关问题