【问题标题】:String permutation spark udf字符串排列 spark udf
【发布时间】:2017-06-21 10:48:42
【问题描述】:

我正在使用 scala 将 pig 脚本转换为 spark 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 将其更改为触发 udf? 谢谢你

【问题讨论】:

    标签: scala apache-spark dataframe udf


    【解决方案1】:

    这就是你如何在 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"))
    

    希望对你有帮助

    【讨论】:

    • 你好;我的程序无法识别import scala.util.{Try, Success, Failure} 并且找不到值尝试;谢谢
    • 您是否尝试导入 import scala.util.{Failure, Success, Try} 并尝试不尝试
    • 感谢@Shankar 的回答和时间;当我使用你的代码时,我得到了一个空列。你能解释一下你的方法以及为什么我得到一个空列吗?谢谢
    猜你喜欢
    • 2021-12-20
    • 1970-01-01
    • 2016-12-15
    • 2021-06-25
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多