我正在尝试将一个字符串转换为hadoop pig中的日期时间对象。但是Grunt给了我一个奇怪的错误信息:它就像它无法选择正确的'ToDate'功能。它要求'明确演员',但我不知道如何这样做。任何的想法 ?
=>错误1045:无法将org.apache.pig.builtin.ToDate的匹配函数推断为多个或不适合。请使用明确的演员。
grunt> describe infos_by_nu_affa;
infos_by_nu_affa: {NU_AFFA: bytearray,affaires: {(NU_AFFA:bytearray,NU_PCP: bytearray,debut: bytearray,fin: bytearray)},prestations: {(NU_AFFA: bytearray,montant: bytearray,date: bytearray,NU_presta: bytearray,beneficiaire: bytearray)},clients: {(NU_PCP: bytearray,nom: bytearray,prenom: bytearray)}}
derivees = foreach infos_by_nu_affa generate *, ToDate(affaires.debut, 'dd/MM/yyyy') as (debut:datetime);
2015-03-28 15:46:36,089 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1045: <line 155, column 0> Could not infer the matching function for org.apache.pig.builtin.ToDate as multiple or none of them fit. Please use an explicit cast.
grunt> dump infos_by_nu_affa
(affaire5,{(affaire5,client5,01/01/14,05/01/15)},{},{(client5,enders,kililan)})
(affaire6,{(affaire6,client6,01/01/13,01/06/14)},{},{(client6,blanco,martine)})
(affaire7,{(affaire7,client7,01/01/10,02/03/13)},{},{(client7,sarah,moore)})
(affaire8,{(affaire8,client8,01/01/15,01/01/01)},{},{(client8,evrard,dominique)})
grunt> derivees = foreach infos_by_nu_affa
>> generate *,
>> COUNT(prestations) as nb_prestations,
>> ToDate(affaires.debut, 'dd/MM/yy') as debut;
2015-03-28 15:56:06,729 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1045:
<line 155, column 0> Could not infer the matching function for org.apache.pig.builtin.ToDate as multiple or none of them fit. Please use an explicit cast.
答案 0 :(得分:1)
原因是您将bag datatype(ie,affaires.debut)
作为输入传递给ToDate
函数,但Todate
函数仅接受chararray or byterarray
作为输入。要解决此问题,您需要先flatten
(affaires.debut)
,然后再转到ToDate
功能。它应该是这样的
derivees_temp = foreach infos_by_nu_affa generate *,FLATTEN(affaires.debut) as (debut_temp:chararray);
derivees = foreach derivees_temp generate *, ToDate(debut_temp, 'dd/MM/yyyy') as (debut:datetime);
注意:在第一个stmt(ie,derivees_temp
)中,展平后debut_temp
的数据类型为chararray
,第二个stmt(ie, derivees
)ToDate
后debut
的数据类型为datetime
。
答案 1 :(得分:0)
当我们没有为函数传递正确的参数类型时,我们会得到这种异常。你在这里也面临同样的问题。 ToDate 功能支持各种类型的参数请参考link并根据需要更正代码。