[英]How to remove a substring of characters from a PySpark Dataframe StringType() column, conditionally based on the length of strings in columns?
我有一个带有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 |
+-------------+-----+
到目前为止,我已经完成了此转换,该转换从我列中称为“代码”的所有行中删除了最后四个字符:
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)"))
这个怎么样:
df.withColumn('code', df['code'].substr(1, 11))
你的想法是对的; 只是当您确实需要一个常量时,才为子字符串的长度提供了一个变化的值。
您可以将内置长度函数与子字符串一起使用:
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))
我根据@gmds的输入找到了问题的答案。 这里是:
df.withColumn("code",expr("substring(code, 1, 11)"))
这段代码将11设置为常量,这意味着该列包含的值是11个字符还是15个字符,转换后它们都将具有11个字符的常量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.