如何为制表符分隔的数据编写pig udf并在左侧添加时间戳?

3j86kqsm  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(293)

我正在尝试为下面的示例输入文件编写pig udf,并指定预期的输出。请帮助我与自定义项模板相同,或让我知道,如果有一种方法来做它没有自定义项。
我的示例输入:

2014-01-23T08:12:09.259443
   Device        Type         make                                    year
-- ------------  ---------  ---------------------------------------  -------------
   desktop       commercial   hp                                      2010
   laptop        commercial   Asus                                    2013
   mobile        personal     Sony                                    2014

2015-01-15T08:12:09.259443
   Device        Type         make                                    year
-- ------------  ---------  ---------------------------------------  -------------
   desktop       commercial   hp                                      2015
   laptop        commercial   Asus                                    2016
   mobile        personal     Sony                                    2013

我基本上需要以时间戳的形式输出,后跟以分隔分隔方式显示的字段,分隔符可以是“,”,“\t”,“|”。在这个例子中,我使用','作为分隔符。
预期产量:

2014-01-23T08:12:09.259443, desktop, commercial, hp, 2010
   2014-01-23T08:12:09.259443, laptop, commercial, Asus, 2013
   2014-01-23T08:12:09.259443, mobile, personal, Sony, 2014
   2015-01-15T08:12:09.259443, desktop, commercial, hp, 2015
   2015-01-15T08:12:09.259443, laptop, commercial, Asus, 2016
   2015-01-15T08:12:09.259443, mobile, personal, Sony, 2013

注意:我不能做预处理,因为有一些tb的文件

bweufnob

bweufnob1#

这就是逻辑:

while(str.hasMoreTokens()){
            val=str.nextToken();
            Pattern pa = Pattern.compile("\\d+[-]\\d+[-]\\d+[T]\\d+[:]\\d+[:]\\d+(\\.\\d+)?");
            Matcher ma = pa.matcher(val);
                boolean b = ma.matches();
                if(b==true)
                {
                timestamp=ma.group().substring(0, 19);
                //System.out.println(timestamp);
                        }

                else if(val.contains("Device") || val.contains("Type") || val.contains("make                                    ") || val.contains("year") || val.contains("--") || val.contains("------------")  || val.contains("---------")  || val.contains("---------------------------------------")  || val.contains("-------------"))
                            {

                            }
                else if(val!=timestamp){

                result=timestamp+val;

                            } 

                if(result.length()>0){

                System.out.println(result.substring(0));
                            }   
        }

请告诉我是否有更有效/更好的方法。谢谢!

相关问题