2013-06-24 4 views
1

Это, вероятно, будет быстрый вопрос, но я попробовал поиск в Google безрезультатно. В основном у меня есть выход в одном из моих выходных столбцов, который иногда превращается в научную нотацию.Как подавить научную нотацию в выводе свиньи

Пример 3.9E-4. Однако, если число достаточно велико, оно сохраняет его как плавающую точку, например 0.08544751199999999.

Как подавить научную нотацию ?!

ответ

2

Я не думаю, что есть способ сделать это с помощью Pig Latin. Чтобы решить подобную проблему, я написал себе UDF, который является только оболочкой для String.format:

import java.io.IOException; 

import org.apache.pig.EvalFunc; 
import org.apache.pig.data.Tuple; 

public class SPRINTF extends EvalFunc<String> { 

    @Override 
    public String exec(Tuple input) throws IOException { 
     if (input.size() != 2) { return null; } 

     String output = null; 
     try { 
      String format = (String) input.get(0); 
      String value = input.get(1).toString(); 

      switch (format.charAt(format.length()-1)) { 
      case 'b': 
      case 'B': 
      case 'h': 
      case 'H': 
      case 's': 
      case 'S': 
      case 'c': 
      case 'C': 
       output = String.format(format, value); 
       break; 
      case 'd': 
      case 'o': 
      case 'x': 
      case 'X': 
       output = String.format(format, Integer.parseInt(value)); 
       break; 
      case 'e': 
      case 'E': 
      case 'f': 
      case 'g': 
      case 'G': 
      case 'a': 
      case 'A': 
       output = String.format(format, Double.parseDouble(value)); 
       break; 
      } 

      return output; 
     } catch (Exception e) { return null; } 
    } 

} 

Может, конечно, быть улучшен, но это должно дать вам представление о том, как начать.