如何将字符串中最后一个位置的减号交换到配置单元中的第一个位置?

时间:2018-03-16 10:44:18

标签: apache-spark hive

如何将负号从最后一个位置换成第一个字符串或整数到第一个位置在hive和/ spark中?

例子: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") 

2 个答案:

答案 0 :(得分:0)

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的优化引擎创建了一个黑盒子),请使用以下使用regex_replace的方式。测试了这个并且它有效:

scala> spark.sql("select REGEXP_REPLACE ( value, '^(\\.+)(-)$','-$1') as custval from values").show

答案 1 :(得分:0)

您可以尝试REGEXP_REPLACE。此模式搜索结尾后跟-的数字,如果找到则将其放在数字之前。

SELECT REGEXP_REPLACE ( val, '^(\\d+)-$','-$1')

Column functions