如何有条件地根据列中字符串的长度从PySpark Dataframe StringType()列中删除字符的子字符串?

时间:2019-04-20 23:05:21

标签: python regex pyspark apache-spark-sql

我有一个带有StringType()列的PySpark Dataframe,该列主要包含15个字符。但是,某些行有11个字符。示例:

df = 
+--------------+--------+
|             code|state|
+--------------+--------+
|'334445532234553'|wa   |
|'332452132234553'|mn   |
|'45532234553'    |fl   |
|'679645532234553'|mo   |
|'918535532234553'|ar   |
|'174925532234553'|wi   |
|'45532234553'    |al   |
|'928405532234553'|ca   |
+--------------+--------+

我需要所有行都包含11个字符,最后4个字符从任何包含15个字符的行中删除。所以这是我想要的输出:

df.show(8) = 
+-------------+-----+
|         code|state|
+-------------+-----+
|'33444553223'|wa   |
|'33245213223'|mn   |
|'45532234553'|fl   |
|'67964553223'|mo   |
|'91853553223'|ar   |
|'17492553223'|wi   |
|'45532234553'|al   |
|'92840553223'|ca   |
+-------------+-----+

到目前为止,我已经完成了此转换,该转换从我列中名为“代码”的所有行中删除了最后4个字符:

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

df = df.withColumn("code",expr("substring(code, 1, length(code)-4)"))

因此,我需要做一些事情以使该条件取决于行中字符串的长度。

编辑,在@gmds的帮助下,我找到了以下解决方案:

df.withColumn("code",expr("substring(code, 1, 11)"))

3 个答案:

答案 0 :(得分:1)

如何?

df.withColumn('code', df['code'].substr(1, 11))

您的想法是正确的;只是当您确实需要一个常量时,才为子字符串的长度提供了一个变化的值。

答案 1 :(得分:1)

您可以将内置长度函数与子字符串一起使用:

from pyspark.sql.functions import substring, length

df = df.withColumn("code", when(length(df.code) > 11, substring(df.code, 1, length(df.code) - 4)).otherwise(df.code))

答案 2 :(得分:0)

我根据@gmds的输入找到了问题的答案。在这里:

df.withColumn("code",expr("substring(code, 1, 11)"))

此代码将11设置为常量,这意味着该列包含的值是11个字符还是15个字符,转换后它们都将具有11个字符的常量。