Scala 字符串置换火花udf

Scala 字符串置换火花udf,scala,apache-spark,dataframe,udf,Scala,Apache Spark,Dataframe,Udf,我正在使用scala将一个pig脚本转换为spark 1.6,我有一个包含字符串的数据帧,我想按一定顺序交换字符。 例如: +----------------+ | Info| +----------------+ |8106f510000dc502| +----------------+ 我想把它转换成这样的顺序[3,1,5,7,6,(8-16),4,2] 这是我使用java的pig UDF,它正在工作: public class NormalizeLocInfo ex

我正在使用scala将一个pig脚本转换为spark 1.6,我有一个包含字符串的数据帧,我想按一定顺序交换字符。
例如:

+----------------+
|            Info|
+----------------+
|8106f510000dc502|
+----------------+
我想把它转换成这样的顺序[3,1,5,7,6,(8-16),4,2]

这是我使用java的pig UDF,它正在工作:

public class NormalizeLocInfo extends EvalFunc<String>
{
    public String exec(Tuple input) throws IOException {
        if (input == null || input.size() == 0)
            return null;
        try{
            char [] ca = ((String)input.get(0)).toCharArray();
            return (
                    new StringBuilder().append(ca[3]).append(ca[0]).append(ca[5]).append(ca[7]).append(ca[6]).append(ca[8]).append(ca[9]).append(ca[10])
               .append(ca[11]).append(ca[12]).append(ca[13]).append(ca[14]).append(ca[15]).append(ca[16]).append(ca[4]).toString().toUpperCase()
               );
        }catch(Exception e){throw new IOException("UDF:Caught exception processing input row :"+input.get(0), e);}
    }
  }
公共类NormalizeLocInfo扩展了EvalFunc
{
公共字符串exec(元组输入)引发IOException{
if(input==null | | input.size()==0)
返回null;
试一试{
char[]ca=((字符串)input.get(0)).toCharArray();
返回(
新建StringBuilder().append(ca[3]).append(ca[0]).append(ca[5]).append(ca[7]).append(ca[6]).append(ca[8]).append(ca[9]).append(ca[10])
.append(ca[11]).append(ca[12]).append(ca[13]).append(ca[14]).append(ca[15]).append(ca[16]).append(ca[4]).toString().toUpperCase()
);
}catch(异常e){throw new IOException(“UDF:catch异常处理输入行:”+input.get(0),e);}
}
}
如何使用scala将其更改为spark udf?
感谢您

这是您如何在spark中为您的函数定义自定义项函数的方法

   import org.apache.spark.sql.functions._

    val exec = udf((input : String) => {
      if (input == null || input.trim == "") ""
      else {
        Try{
          val ca = input.toCharArray
          List(3,1,5,7,6,9,10,11,12,13,14,15,16,4,2).map(a=>ca(a-1)).mkString
        } match{
          case Success(data) => data
          case Failure(e)  =>
            println(e.printStackTrace())
            ""
        }
      }
    })
可以将函数与withColumn()一起用作


希望这有帮助

您好;我的程序无法识别
导入scala.util.{Try,Success,Failure}
和未找到值Try;感谢您尝试导入import scala.util.{Failure,Success,try}和try not trythank you@Shankar获取您的答案和时间;当我使用你的代码时,我得到了一个空列。请你给我解释一下你的方法,以及为什么我得到一个空栏。非常感谢。
   import org.apache.spark.sql.functions._

    val exec = udf((input : String) => {
      if (input == null || input.trim == "") ""
      else {
        Try{
          val ca = input.toCharArray
          List(3,1,5,7,6,9,10,11,12,13,14,15,16,4,2).map(a=>ca(a-1)).mkString
        } match{
          case Success(data) => data
          case Failure(e)  =>
            println(e.printStackTrace())
            ""
        }
      }
    })
val dfNew = df.withColumn("newCol", exec($"oldCol"))