spark sql判断一个字段是否包含另一个字段的字符串

spark | 2019-09-13 10:02:39

我的场景是要判断字符串 a字段是否包含另一个b字段,如果包含新字段的值就是1,否则就是0


instr函数

找了半天才找到 api org.apache.spark.sql.functions中有一个instr函数


/**
   * Locate the position of the first occurrence of substr column in the given string.
   *返回提供的字符串在字段中第一次出现的位置
   * Returns null if either of the arguments are null.
   *如果参数是null,就返回null
   *
   * @note The position is not zero based, but 1 based index. Returns 0 if substr
   *注意开始值不是从0开始,而是从1开始,如果不存在字符串就返回0
   * could not be found in str.
   *
   * @group string_funcs
   * @since 1.5.0
   */
  def instr(str: Column, substring: String): Column = withExpr {
    StringInstr(str.expr, lit(substring).expr)
  }

注意:虽然第二个参数只能传入字符串而不是column,但看方法的实现,第二个参数调用了lit .expr,和第一个参数一样也是会被转成column的

看一下lit这个函数的实现

 /**
   * Creates a [[Column]] of literal value.
   *根据字符创建column
   *
   * The passed in object is returned directly if it is already a [[Column]].
   *如果传入的是已经存在的字段那就返回改字段
   * If the object is a Scala Symbol, it is converted into a [[Column]] also.
   *如果是scala变量,也转成字段
   * Otherwise, a new [[Column]] is created to represent the literal value.
   *否则就创建一个新字段
   *
   * @group normal_funcs
   * @since 1.3.0
   */
  def lit(literal: Any): Column = typedLit(literal)


我的写法

新增字段 判断一个字段是否包含另一个字段的字符串,如果包含值为1否则是0

Df.withColumn("newColumn",when(instr($"aColumn","bColumn")===0,0).otherwise(1))

当然我喜欢编码的方式,你也可以用sql的方式。


登录后即可回复 登录 | 注册
    
关注编程学问公众号