PIG - 匹配日期功能

时间:2015-03-28 14:50:04

标签: hadoop apache-pig

我正在尝试将一个字符串转换为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.

2 个答案:

答案 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, deriveesToDatedebut的数据类型为datetime

答案 1 :(得分:0)

当我们没有为函数传递正确的参数类型时,我们会得到这种异常。你在这里也面临同样的问题。 ToDate 功能支持各种类型的参数请参考link并根据需要更正代码。