如何截断火花数据框列的值? [复制]
Posted
技术标签:
【中文标题】如何截断火花数据框列的值? [复制]【英文标题】:How to truncate the values of a column of a spark dataframe? [duplicate] 【发布时间】:2019-06-03 19:11:41 【问题描述】:我想为 spark 数据帧的单列中的每个字符串删除字符串的最后两个值。我想在 spark 数据框中执行此操作,而不是将其移动到 pandas 然后再返回。
下面是一个示例数据框,
# +----+-------+
# | age| name|
# +----+-------+
# | 350|Michael|
# | 290| Andy|
# | 123| Justin|
# +----+-------+
其中年龄列的 dtype 是一个字符串。
# +----+-------+
# | age| name|
# +----+-------+
# | 3|Michael|
# | 2| Andy|
# | 1| Justin|
# +----+-------+
这是预期的输出。字符串的最后两个字符已被删除。
【问题讨论】:
【参考方案1】:嗨,Scala/sparkSql 这样做的方式非常简单。
val result = originalDF.withColumn("age", substring(col("age"),0,1))
reult.show
你可能可以得到你的 pyspark 语法
【讨论】:
取第一个字符和去掉最后一个字符是不一样的。如果字符串有4个字符呢? 如果字符串也有 2 个字符,则可以进行大小写,结果会是什么?一个空?这可以通过取第一个字符来避免。用户可以更详细地说明用例。无论如何,就像我说的那样,这两种方法在各自的方式上都是正确的。无论字符串长度如何,都更倾向于给出第一个字符。另一个回答用户发布的问题。【参考方案2】:来自函数的substring
、length
、col
、expr
可用于此目的。
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|
+----+-------+
斯卡拉答案:
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
结果:
原DF +---+-------+ |年龄|姓名| +---+-------+ |350|迈克尔| |290|安迪| |123|贾斯汀| +---+-------+ 修改的 +---+-------+ |年龄|姓名| +---+-------+ | 3|迈克尔| | 2|安迪| | 1|贾斯汀| +---+-------+【讨论】:
嗨 Ram,我认为年龄 -2 不是一个好主意,因为如果数据的长度不超过 3,它可能会引入错误。我将其保留为硬编码值的原因0 ,1。这不会使它更健壮吗? :-) 正常情况下,一个人不会活 1000 年,最多可以活 100 年,这就是我大胆尝试的原因。你想重新投票吗:-) 那不是我的本意。相反,我看到人们用伪术语提出问题。我不认为 350 岁也有意义,更不用说 1250 年了。上帝保佑我们都活得那么久。 是的,明白了。那是如何实现它的方法的一个例子。如果数据不同,用户可以更改子字符串。它非常简单:-) @RamGhadiyaramRam 我不确定这个答案增加了什么,在副本中还没有解决。以上是关于如何截断火花数据框列的值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章