我的场景是要判断字符串 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的方式。