在 pyspark 中,如何将字符串添加/连接到列?

Posted

技术标签:

【中文标题】在 pyspark 中,如何将字符串添加/连接到列?【英文标题】:In pyspark, how do you add/concat a string to a column? 【发布时间】:2018-03-21 04:01:28 【问题描述】:

我想向现有列添加一个字符串。例如,df['col1'] 的值为'1', '2', '3' 等,我想在col1 的左侧连接字符串'000',这样我就可以获得一列(新的或替换旧的无关紧要)为@ 987654325@。

我认为我应该使用df.withColumn('col1', '000'+df['col1']),但它当然不起作用,因为 pyspark 数据帧是不可变的?

这应该是一件容易的事,但我没有在网上找到任何东西。希望有人能给我一些帮助!

谢谢!

【问题讨论】:

【参考方案1】:
from pyspark.sql.functions import concat, col, lit


df.select(concat(col("firstname"), lit(" "), col("lastname"))).show(5)
+------------------------------+
|concat(firstname,  , lastname)|
+------------------------------+
|                Emanuel Panton|
|              Eloisa Cayouette|
|                   Cathi Prins|
|             Mitchel Mozdzierz|
|               Angla Hartzheim|
+------------------------------+
only showing top 5 rows

http://spark.apache.org/docs/2.0.0/api/python/pyspark.sql.html#module-pyspark.sql.functions

【讨论】:

嗨史蒂文,感谢您的帮助!我认为您的解决方案适用于我的情况,我做了一些修改以适应我的情况,如 df = df.withColumn('col1', concat(lit("000"), col("col1"))) 。另外,使用 lit 添加常量来修改 pyspark 中的列值的唯一方法是什么?因为在熊猫中,我只会使用 df['col1']='000' + df['col1'] 但不确定是否在 pyspark 中,会有多种方法来实现它! 这并没有真正回答 OP 提出的问题,它只是展示了如何连接两列。 我使用的是 Python 2.7,但我没有发现它。对于同一问题,python 2.7 的替代方案是什么?【参考方案2】:

这里的另一个选项是使用pyspark.sql.functions.format_string(),它允许您使用C printf style formatting。

这是一个列中的值为整数的示例。

import pyspark.sql.functions as f
df = sqlCtx.createDataFrame([(1,), (2,), (3,), (10,), (100,)], ["col1"])
df.withColumn("col2", f.format_string("%03d", "col1")).show()
#+----+----+
#|col1|col2|
#+----+----+
#|   1| 001|
#|   2| 002|
#|   3| 003|
#|  10| 010|
#| 100| 100|
#+----+----+

这里的格式"%03d" 表示打印一个左填充最多3 个零的整数。这就是为什么10 被映射到010100 根本没有变化的原因。

或者,如果您想在前面恰好添加 3 个零:

df.withColumn("col2", f.format_string("000%d", "col1")).show()
#+----+------+
#|col1|  col2|
#+----+------+
#|   1|  0001|
#|   2|  0002|
#|   3|  0003|
#|  10| 00010|
#| 100|000100|
#+----+------+

【讨论】:

这是一个更笼统的答案,示例解决了确切的问题,但是当我发现这个问题时,我发现前一个对我正在寻找的内容更有用。品种是金!

以上是关于在 pyspark 中,如何将字符串添加/连接到列?的主要内容,如果未能解决你的问题,请参考以下文章

将pyspark列连接到pyspark DataFrame

如何将 PySpark 连接到 Bigquery

如何将 Pyspark 连接到在 docker 上运行的 datastax Cassandra?

如何将带有列表值的熊猫列连接到一个列表中?

如何在 PySpark 中连接到 Presto JDBC?

如何将 python 列表添加到 pyspark 列? [复制]