pyspark 如何截断spark dataframe的列的值?[重复]

xqkwcwgp  于 2023-03-22  发布在  Spark
关注(0)|答案(2)|浏览(154)

此问题在此处已有答案

remove last few characters in PySpark dataframe column(5个答案)
三年前关闭了。
我想在spark dataframe的单个列中删除每个字符串的最后两个值。我想在spark dataframe中做到这一点,而不是将其移动到pandas然后返回。
示例 Dataframe 将在下面,

# +----+-------+
# | age|   name|
# +----+-------+
# | 350|Michael|
# | 290|   Andy|
# | 123| Justin|
# +----+-------+

其中age列的dtype是字符串。

# +----+-------+
# | age|   name|
# +----+-------+
# |   3|Michael|
# |   2|   Andy|
# |   1| Justin|
# +----+-------+

这是预期的输出。字符串的最后两个字符已被删除。

a7qyws3x

a7qyws3x1#

Scala/sparkSql的方法很简单。

val result = originalDF.withColumn("age", substring(col("age"),0,1))
result.show

你可能会得到pyspark的语法

l5tcr1uw

l5tcr1uw2#

函数中的substringlengthcolexpr可用于此目的。

from pyspark.sql.functions import substring, length, col, expr

df =你的df在这里
子字符串索引1,-2被使用,因为它的3位数字和....它的年龄字段逻辑上一个人不会活超过100岁:-)OP可以改变子字符串功能适合他的要求。

df.withColumn("age",expr("substring(age, 1, length(age)-2)"))
df.show

结果:

+----+-------+
 | age|   name|
 +----+-------+
 |   3|Michael|
 |   2|   Andy|
 |   1| Justin|
 +----+-------+

Scala回答:

val originalDF =  Seq(
      (350, "Michael"),
      (290, "Andy"),
      (123, "Justin")
    ).toDF("age", "name")
println(" originalDF " )

    originalDF.show
    println("modified")
    originalDF.selectExpr("substring(age,0,1) as age", "name "  ).show

结果:

originalDF 
+---+-------+
|age|   name|
+---+-------+
|350|Michael|
|290|   Andy|
|123| Justin|
+---+-------+

modified
+---+-------+
|age|   name|
+---+-------+
|  3|Michael|
|  2|   Andy|
|  1| Justin|
+---+-------+

相关问题