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

use*_*334 8 python schema dictionary user-defined-functions apache-pig

使用Apache PIG时从Python UDF返回字典的输出模式是什么.

我有一本字典词典,如下所示:

dict = {x:{a:1,b:2,c:3}, y:{d:1,e:3,f:9}}
Run Code Online (Sandbox Code Playgroud)

我的输出架构看起来像

@outputSchema("m:map[im:map[X:float,Y:float]]") 
Run Code Online (Sandbox Code Playgroud)

**方括号,因为在Pig中我们使用[]作为此词典转换为的地图.

小智 4

如果您使用标准 jython UDF 而不是任何其他发行版(例如 mortar data 提供的 Streaming_python),您需要做的就是:

@outputSchema('m:map[]') 
Run Code Online (Sandbox Code Playgroud)

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

([first#{third=inner_dict},first#outter_dict])
Run Code Online (Sandbox Code Playgroud)

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

@outputSchema('m:map[chararray]')
Run Code Online (Sandbox Code Playgroud)

元组和包:

当您想要从 jython UDF 返回元组或包时,记住 python 的列表会转换为包,元组会转换为元组。例如:

列表:

@outputSchema('m:bag{chararray}')
Run Code Online (Sandbox Code Playgroud)

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

@outputSchema('map_reduce:bag{t:(key:chararray,value:int,start_date:datetime,end_date:datetime)}')
Run Code Online (Sandbox Code Playgroud)

最后,元组应该在某种程度上是直观的,它们是使用 jython 时最容易使用的结构。在元组中,您可以设置任意数量的字段和任意数量的级别,只要遵循上面的示例即可。您可以在元组中声明一个元组,一个包含包和其他值的元组,等等。

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