2017-06-21 88 views
0

我正在收斂一個豬腳本來使用scala來激發1.6,我有一個包含字符串的數據框,並且我想以特定順序交換字符。
例如:字符串排列火花udf

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

我想把它轉換成這樣的順序[3,1,5,7,6,(8-16),4,2]

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

這是我的用UDF的生豬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來激發udf? 感謝歐

回答

1

這是如何定義的火花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")) 

希望這有助於

+0

你好;我的程序無法識別'import scala.util。{Try,Success,Failure}'而未找到值試試;謝謝 –

+0

您是否嘗試導入導入scala.util。{失敗,成功,嘗試}並嘗試不嘗試 –

+0

謝謝@Shankar您的回答和時間;當我使用你的代碼時,我得到了一個空列。你可否向我解釋你的方法,以及爲什麼我得到一個空欄。謝謝 –