spark sql函数rtrim的bug?

6pp0gazn  于 2021-07-13  发布在  Spark
关注(0)|答案(2)|浏览(250)

当指定的字符串包含时。性格,结果会是错误的。请记住,第一行代码列的数据类型是字符串。下面的两个语句总是显示相同的结果。

newData
  .withColumn("c",rtrim($"first_specific_businessn_line_code",".0"))
  .show(false)

 newData
  .withColumn("c",rtrim($"first_specific_businessn_line_code","\\.0"))
  .show(false)

+----------------------------------+---+
|first_specific_businessn_line_code|c  |
+----------------------------------+---+
|8.0                               |8  |
|80.0                              |8  |
+----------------------------------+---+

o8x7eapl

o8x7eapl1#

那不是虫子。rtrim将删除我们指定的字符。
请检查此链接:rtrim函数
rtrim(80.0,“.0”)-->这将删除。列值的尾端为0。所以结果是8
您可以使用regexp\u replace/regexp\u extract来获得结果。

val spark = SparkSession.builder().master("local[*]").getOrCreate()
spark.sparkContext.setLogLevel("OFF")
import spark.implicits._
import org.apache.spark.sql.functions._
Seq("8.0","80.0").toDF()
      .withColumn("regexp_replace",regexp_replace('value,"[.]\\d+",""))
      .withColumn("regexp_extract",regexp_extract('value,"(\\d+).(\\d+)",1))
      .show()

 /* output
 +-----+--------------+--------------+
 |value|regexp_replace|regexp_extract|
 +-----+--------------+--------------+
 |  8.0|             8|             8|
 | 80.0|            80|            80|
 +-----+--------------+--------------+

 */
vs3odd8k

vs3odd8k2#

你可以用 regexp_replace 替换 .0 出现在结尾( $ 在正则表达式中):

newData.withColumn("c", regexp_replace($"first_specific_businessn_line_code", "\\.0$", "")).show
+----------------------------------+---+
|first_specific_businessn_line_code|  c|
+----------------------------------+---+
|                               8.0|  8|
|                              80.0| 80|
+----------------------------------+---+

相关问题