使用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。
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。学习曲线可以稍微陡峭一点,但一旦你通过了,你的发展会更快,你的程序的吞吐量也会更快。
1条答案
按热度按时间q9rjltbz1#
如果您使用的是标准jython UDF,而不是任何其他发行版(如Mortart data提供的流式python),那么您需要做的就是:
这些键与在python中设置的键相同。如果您的dict中还有其他词典,您不必担心,pig会理解它并使用以下语法:
将dict从jythonudf传递回pig有一个很大的缺点,您只能为dict中的所有值设置一个数据类型,这意味着如果您不设置任何数据类型,pig将使用bytearray作为数据类型,这在处理日期或复杂结构时可能是一个问题。例如:
元组和包:
当您想从jythonudfs将一个元组或一个包返回给pig时,记住python的列表转换为包,元组转换为元组是很有用的。例如:
列表:
请记住,pig包中充满了元组,因此如果您想为您的包设置一个好的结构,您可以在包中声明一个元组,这样您就可以设置您将要传递的所有数据类型。例子:
最后,元组应该是直观的,它们是使用jython时最容易使用的结构。在一个元组中,只要遵循上面的示例,就可以设置任意多个字段和任意多个级别。你可以在一个元组中声明一个元组,一个有包和其他值的元组,等等。
我强烈建议在尝试执行复杂操作或处理json结构、数组和列表等复杂数据类型时使用javaudfs。学习曲线可以稍微陡峭一点,但一旦你通过了,你的发展会更快,你的程序的吞吐量也会更快。