簡體   English   中英

字符串置換Spark UDF

[英]String permutation spark udf

我正在使用scala轉換一個Pig腳本來激發1.6,我有一個包含字符串的數據框,並且我想按特定順序交換字符。
例如:

+----------------+
|            Info|
+----------------+
|8106f510000dc502|
+----------------+

我想按此順序進行轉換[3,1,5,7,6,(8-16),4,2]

+----------------+
|            Info|
+----------------+
|08f150000dc50241|
+----------------+

這是我的帶有Java的豬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);}
    }
  }

我如何使用Scala將其更改為Spark UDF? 謝謝你

這是您可以在Spark中為函數定義UDF函數的方法

   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()一起使用

val dfNew = df.withColumn("newCol", exec($"oldCol"))

希望這可以幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM