2016-03-01 104 views
0

我有一個文件,它有一個像豬替換命令

11/16/2015,"others (phone,health,etc.)",cont'd attempts,"resource,inc.",dg 

我想刪除逗號目前只有內部雙引號的數據。

預期結果

11/162015,"others(phone health etc.)",cont'd attempts,"resource inc.",dg 

到目前爲止我試過

Foreach a generate replace ($1,',',''); 
Foreach a generate regex_extract($1,'[\,]+',1); 

但他們沒有工作。

+0

你可以給ud輸出你想要的嗎? –

+0

我想輸出爲 – Jig232

+0

我想要輸出爲11/16/2015,「其他(電話健康等)」,繼續嘗試,「資源公司」,dg – Jig232

回答

0

所有的弗里斯特使用REGULAR EXP分隔字段的元組,然後應用更換

試試這個代碼:

a = load '<path>' as line; 

b = foreach a generate FLATTEN(REGEX_EXTRACT_ALL(line,'(.*)[,]["](.*)["][,](.*)[,]["](.*)["][,](.*)')); 

c = foreach b generate $0,REPLACE($1,',',' '),$2,REPLACE($3,',',' '),$4; 
dump c; 
0

可以使用UDF是可以實現的,它可以看看在每個元組中的所有字段都通過。

import java.util.HashMap; 
import java.util.Iterator; 
import java.util.ArrayList; 
import java.io.IOException; 
import java.lang.Long; 
import java.lang.Exception; 

import org.apache.pig.EvalFunc; 
import org.apache.pig.data.Tuple; 
import org.apache.pig.data.DataBag; 
import org.apache.pig.data.BagFactory; 
import org.apache.pig.data.DataType; 
import org.apache.pig.impl.logicalLayer.schema.Schema; 
import org.apache.pig.impl.logicalLayer.FrontendException; 
import org.apache.pig.backend.executionengine.ExecException; 

public class CommaRemove extends EvalFunc<DataBag> { 

    @Override 
    public DataBag exec(Tuple input) throws IOException { 
     if (input == null || input.size() == 0) { 
      return null; 
     } 

     try { 
      int inputSize = input.size(); 
      Tuple output = TupleFactory.getInstance().newTuple(inputSize); 
      for(int i = 0; i < inputSize ; i++) 
      { 
       output.set(i, input.get(i).replace(',','')); 
      } 
      return output; 
     } catch (Exception e) { 
      System.err.println("Failed to process input; error - " + e.getMessage()); 
      return null; 
     } 
    } 
} 
+0

Thanks @Rahul但是對於output.set(i,input.get(i).replace(',',''));我變得無效的字符常量 – Jig232