udf字典在pig中返回模式

cunj1qz1  于 2021-06-24  发布在  Pig
关注(0)|答案(1)|浏览(362)

使用apache pig时,从python udf返回字典的输出模式是什么。
我有一本字典,大概是这样的:

dict = {x:{a:1,b:2,c:3}, y:{d:1,e:3,f:9}}

我的输出模式看起来像

@outputSchema("m:map[im:map[X:float,Y:float]]")

**方括号,因为在pig中,我们使用[]表示此字典转换为的Map。

q9rjltbz

q9rjltbz1#

如果您使用的是标准jython UDF,而不是任何其他发行版(如Mortart data提供的流式python),那么您需要做的就是:

@outputSchema('m:map[]')

这些键与在python中设置的键相同。如果您的dict中还有其他词典,您不必担心,pig会理解它并使用以下语法:

([first#{third=inner_dict},first#outter_dict])

将dict从jythonudf传递回pig有一个很大的缺点,您只能为dict中的所有值设置一个数据类型,这意味着如果您不设置任何数据类型,pig将使用bytearray作为数据类型,这在处理日期或复杂结构时可能是一个问题。例如:

@outputSchema('m:map[chararray]')

元组和包:
当您想从jythonudfs将一个元组或一个包返回给pig时,记住python的列表转换为包,元组转换为元组是很有用的。例如:
列表:

@outputSchema('m:bag{chararray}')

请记住,pig包中充满了元组,因此如果您想为您的包设置一个好的结构,您可以在包中声明一个元组,这样您就可以设置您将要传递的所有数据类型。例子:

@outputSchema('map_reduce:bag{t:(key:chararray,value:int,start_date:datetime,end_date:datetime)}')

最后,元组应该是直观的,它们是使用jython时最容易使用的结构。在一个元组中,只要遵循上面的示例,就可以设置任意多个字段和任意多个级别。你可以在一个元组中声明一个元组,一个有包和其他值的元组,等等。
我强烈建议在尝试执行复杂操作或处理json结构、数组和列表等复杂数据类型时使用javaudfs。学习曲线可以稍微陡峭一点,但一旦你通过了,你的发展会更快,你的程序的吞吐量也会更快。

相关问题