gpt4 book ai didi

scala - Spark中rtrim函数的意外结果

转载 作者:行者123 更新时间:2023-12-04 08:15:49 29 4
gpt4 key购买 nike

我正在尝试了解 Spark sql 函数遇到的问题 rtrim .我试图从字符串中删除一个子字符串,但结果与我预期的不一样。当我尝试删除 _count 时来自 test_count , 我得到 tes而不是 test .但是如果我尝试删除 _count来自 TEST_count , 我得到 TEST正如预期的那样。
我的示例代码:

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

case class Test(test_count: String, test1_count: String)
val df = Seq(
Test("test_count", "TEST_count")
).toDF

df
.withColumn("test", rtrim($"test_count", "_count"))
.withColumn("test1", rtrim($"test1_count", "_count"))
.withColumn("test_", rtrim($"test_count", "count"))
.withColumn("test1_", rtrim($"test1_count", "count"))
.show
它的结果:
+----------+-----------+----+-----+-----+------+
|test_count|test1_count|test|test1|test_|test1_|
+----------+-----------+----+-----+-----+------+
|test_count| TEST_count| tes| TEST|test_| TEST_|
+----------+-----------+----+-----+-----+------+
我试图添加 \\之前 _count但它没有用。我找到了实现预期结果的另一种方法,但我想更好地了解 trim在 Spark 中工作。我做错了什么还是行为确实出乎意料?

最佳答案

这是正确的行为。 rtrim删除所有出现的指定 字符 在字符串的右侧,而不是指定的字符串。所以如果你有 test_count而你rtrim _count ,它将删除 _ 中的每个字符, c , o , u , n , t从右边开始,直到找到一个不是其中之一的字符。这会导致删除最后一个 ttest ,但不是 s因为 s不在列表中。

test_count
^^^^^^^ all these are in [`_`, `c`, `o`, `u`, `n`, `t`]
^ but this isn't, so the string is trimmed until here
要实现您想要的,您可以使用 regexp_replace用空字符串替换最后一位。 $在正则表达式中表示字符串的结尾(右侧)。如果你想用 ltrim 做类似的事情您可以使用 ^在正则表达式中。
df
.withColumn("test", regexp_replace($"test_count", "_count$", ""))
.withColumn("test1", regexp_replace($"test1_count", "_count$", ""))
.withColumn("test_", regexp_replace($"test_count", "count$", ""))
.withColumn("test1_", regexp_replace($"test1_count", "count$", ""))
.show
+----------+-----------+----+-----+-----+------+
|test_count|test1_count|test|test1|test_|test1_|
+----------+-----------+----+-----+-----+------+
|test_count| TEST_count|test| TEST|test_| TEST_|
+----------+-----------+----+-----+-----+------+

关于scala - Spark中rtrim函数的意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65709513/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com