如何将负号从字符串或整数中的最后一个位置交换到第一个位置,再到蜂巢和/火花中的第一个位置?
示例:22-
必需: -22
我的代码是:
val Validation1 = spark.sql("Select case when substr(YTTLSVAL-,-1,1)='-' then cast(concat('-',substr(YTTLSVAL-,1,length(YTTLSVAL-)-1)) as int) else cast(YTTLSVAL- as int) end as column_name")
scala> Seq("-abcd", "def", "23-", "we").toDF("value").createOrReplaceTempView("values")
scala> val f = (x: String) => if(x.endsWith("-")) s"-${x.dropRight(1)}" else x
scala> spark.udf.register("myudf", f)
scala> spark.sql("select *, myudf(*) as custval from values").show
+-----+-------+
|value|custval|
+-----+-------+
|-abcd| -abcd|
| def| def|
| 23-| -23|
| we| we|
+-----+-------+
编辑
再三考虑,因为除非您绝对需要UDF(因为它们为Spark的优化引擎创建了一个黑匣子(,因此不鼓励使用UDF,请使用以下使用regex_replace
的方式。已经对此进行了测试,它可以工作:
scala> spark.sql("select REGEXP_REPLACE ( value, '^(\.+)(-)$','-$1') as custval from values").show
你可以
试试REGEXP_REPLACE
。此模式搜索一个数字,后跟末尾的 -
,如果找到,则将其放在数字之前。
SELECT REGEXP_REPLACE ( val, '^(\d+)-$','-$1')
列函数