如何:PIG中的Python UDF字典返回模式

时间:2012-11-12 19:55:06

标签: python dictionary schema user-defined-functions apache-pig

使用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中我们使用[]作为此词典转换为的地图。

1 个答案:

答案 0 :(得分:3)

如果您使用的是标准的jython UDF而不是任何其他发行版,例如迫击炮数据提供的streaming_python,那么您只需要:

@outputSchema('m:map[]') 

密钥与您在python中设置的密钥相同。如果你的词典中有另一个词典你不应该担心它,猪会理解它并使用以下语法:

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

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

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

元组和包包:

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

解释

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

请记住,Pig包中充满了元组,所以如果你想为你的包设置一个漂亮的结构,你可以在包中声明一个元组,然后你就可以设置你将要传递的所有数据类型。例如:

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

最后,元组应该是某种直观的,它们是使用jython时最简单的结构。在元组中,只要您按照上面的示例,就可以设置所需的字段数和所需的多个字段。你可以在一个元组中声明一个元组,一个有一个包和其他值的元组等。

我强烈建议在尝试执行复杂操作或使用复杂数据类型(如JSON结构,数组和列表)时使用Java UDF。学习曲线可能会更加陡峭,但是一旦你通过了,你的开发速度会快得多,而且程序的吞吐量也会更快。