如何在sparksql中使用left和right关键字

bvpmtnay  于 2021-05-27  发布在  Spark
关注(0)|答案(3)|浏览(399)

我是新来的,
在ms sql中,我们留下了关键字, LEFT(Columnname,1) in('D','A') then 1 else 0 .
如何在sparksql中实现相同的功能。

watbbzwu

watbbzwu1#

你可以用 substring 带正数的函数 pos 从左边取:

import org.apache.spark.sql.functions.substring

substring(column, 0, 1)

而且是否定的 pos 从右边取:

substring(column, -1, 1)

所以在scala中你可以定义

import org.apache.spark.sql.Column
import org.apache.spark.sql.functions.substring

def left(col: Column, n: Int) = {
  assert(n >= 0)
  substring(col, 0, n)
}

def right(col: Column, n: Int) = {
  assert(n >= 0)
  substring(col, -n, n)
}

val df = Seq("foobar").toDF("str")

df.select(
  Seq(left _, right _).flatMap(f => (1 to 3).map(i => f($"str", i))): _*
).show
+--------------------+--------------------+--------------------+---------------------+---------------------+---------------------+
|substring(str, 0, 1)|substring(str, 0, 2)|substring(str, 0, 3)|substring(str, -1, 1)|substring(str, -2, 2)|substring(str, -3, 3)|
+--------------------+--------------------+--------------------+---------------------+---------------------+---------------------+
|                   f|                  fo|                 foo|                    r|                   ar|                  bar|
+--------------------+--------------------+--------------------+---------------------+---------------------+---------------------+

类似于python:

from pyspark.sql.functions import substring
from pyspark.sql.column import Column

def left(col, n):
    assert isinstance(col, (Column, str))
    assert isinstance(n, int) and n >= 0
    return substring(col, 0, n)

def right(col, n):
    assert isinstance(col, (Column, str))
    assert isinstance(n, int) and n >= 0
    return substring(col, -n, n)
bfnvny8b

bfnvny8b2#

要建立在user6910411的答案之上,还可以使用isin,然后使用角色比较的结果构建一个新列。
最终的完整代码如下所示

import org.apache.spark.sql.functions._

df.select(substring($"Columnname", 0, 1) as "ch")
    .withColumn("result", when($"ch".isin("D", "A"), 1).otherwise(0))
h5qlskok

h5qlskok3#

import org.apache.spark.sql.functions._

使用 substring(column, 0, 1) 而不是 LEFT 功能。
哪里
0:字符串中的起始位置
1:要选择的字符数
示例:考虑一个左函数:

LEFT(upper(SKU),2)

相应的sparksql语句是:

substring(upper(SKU),1,2)

相关问题