【问题标题】:How to use instr() function with Column type arguments in Spark如何在 Spark 中使用带有列类型参数的 instr() 函数
【发布时间】:2018-07-13 16:46:59
【问题描述】:

我在 Spark 中使用 instr() 函数时遇到问题。函数定义如下:

instr(Column str, String substring)

问题是我需要使用 Column 类型值作为第二个参数。我创建了获取两个 Column 类型参数的示例函数:

def test_func(val1:Column, val2:Column) : Column = {
    val instr_val : Column = instr(val2, val1)

    return instr_val
   }

val df = sc.parallelize(Seq((123, "940932123"), (940, "123940932"), (932, "940123932"))).toDF("KOL1", "KOL2")
df.withColumn("KOL3", test_func($"A", $"B")).show

它给出这样的错误:

<console>:322: error: type mismatch;
 found   : org.apache.spark.sql.Column
 required: String
           val instr_val : Column = instr(val2, val1)

我尝试使用 expr() 函数,但它也给出了错误。有谁知道如何解决这个问题?

【问题讨论】:

    标签: scala apache-spark apache-spark-sql


    【解决方案1】:

    instr 并非旨在以您想要的方式使用它,但您始终可以尝试定义一个 udf 来完成这项工作:

    scala> val instr2_ : (String, String) => Int = (str, sub) => str.indexOfSlice(sub)
    // instr2_: (String, String) => Int = <function2>
    
    scala> val instr2 = udf(instr2_)
    // instr2: org.apache.spark.sql.expressions.UserDefinedFunction = UserDefinedFunction(<function2>,IntegerType,Some(List(StringType, StringType)))
    
    scala> df.withColumn("KOL3", instr2($"KOL2",$"KOL1")).show
    // +----+---------+----+
    // |KOL1|     KOL2|KOL3|
    // +----+---------+----+
    // | 123|940932123|   6|
    // | 940|123940932|   3|
    // | 932|940123932|   6|
    // +----+---------+----+
    

    【讨论】:

      猜你喜欢
      • 2019-03-13
      • 2022-06-16
      • 1970-01-01
      • 1970-01-01
      • 2022-11-25
      • 2017-04-12
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多