如何截断火花数据框列的值? [复制]

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】:

来自函数的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|
 +----+-------+

斯卡拉答案:

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 我不确定这个答案增加了什么,在副本中还没有解决。

以上是关于如何截断火花数据框列的值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

将火花数据框列中的值提取到新的派生列中

根据底行中的值对数据框列的顺序进行排序

如何在循环中读取数据框列值并检查每列的数据类型

将多个火花数据框列转换为具有列表类型的单列

如何在 ggplot 中创建一个图例,将名称和颜色分配给列而不是数据框列中的值?

根据另一列的值过滤数据框列[重复]