2012-11-12 55 views
8

什么是使用Apache PIG时从Python UDF返回字典的输出架构?如何: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]]") 

**方括号中猪,我们使用[]在地图此字典转换为。

回答

3

如果您使用的是标准的Jython的UDF,而不是任何其他分销如砂浆数据提供的streaming_python,所有你需要做的是:

@outputSchema('m:map[]') 

的关键将是相同的,你已经设置在python中。如果你有你的字典中的另一个字典,你不应该担心,猪会了解它,使用的语法如下:

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

有一个很大的缺点有关从Jython的UDF通过字典回猪头,你是只能为dict中的所有值设置一个数据类型,这意味着如果您未设置任何数据类型,pig将使用bytearray作为数据类型,并且在处理日期或复杂结构时可能会出现问题。例如:

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

元组和手袋:

当你想从一个Jython的UDF返回一个元组或一包回猪要记住,Python的列表转换成袋和元组的元组是有益的。例如:

列表:

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

记住,猪塑料袋内的元组,所以如果你想为你的包一个很好的结构,你可以声明包内的元组,有你将能够设置您将传递的所有数据类型。例如:

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

最后,元组应该是某种直观的,它们是使用jython时最简单的结构。在一个元组中,只要你遵循上面的例子,你可以设置你想要的许多字段和任意数量的字段。你可以在一个元组中声明一个元组,包含一个包和其他值的元组等。

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