8

使用 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 中,我们使用 [] 表示此字典转换为的映射。

4

1 回答 1

4

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

@outputSchema('m:map[]') 

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

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

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

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

元组和包:

当您想从 jython UDF 将元组或包返回给 pig 时,记住 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。学习曲线可能会稍微陡峭一些,但是一旦你通过了,你的开发会更快,程序的吞吐量也会更快。

于 2014-12-03T14:45:05.483 回答