在 pyspark 中的自定义分隔符上拆分字符串

问题描述 投票:0回答:2

我有 foo 列的数据,可以是

foo
abcdef_zh
abcdf_grtyu_zt
pqlmn@xl

从这里我想创建两列,以便

Part 1      Part 2
abcdef       zh
abcdf_grtyu  zt
pqlmn        xl

我为此使用的代码是

data = data.withColumn("Part 1",split(data["foo"],substring(data["foo"],-3,1))).get_item(0)
data = data.withColumn("Part 2",split(data["foo"],substring(data["foo"],-3,1))).get_item(1)

但是我收到一个错误列不可迭代

pyspark apache-spark-sql
2个回答
1
投票

以下应该有效

>>> from pyspark.sql import Row
>>> from pyspark.sql.functions import expr
>>> df = sc.parallelize(['abcdef_zh', 'abcdfgrtyu_zt', 'pqlmn@xl']).map(lambda x: Row(x)).toDF(["col1"])
>>> df.show()
+-------------+
|         col1|
+-------------+
|    abcdef_zh|
|abcdfgrtyu_zt|
|     pqlmn@xl|
+-------------+
>>> df.withColumn('part2',df.col1.substr(-2, 3)).withColumn('part1', expr('substr(col1, 1, length(col1)-3)')).select('part1', 'part2').show()
+----------+-----+
|     part1|part2|
+----------+-----+
|    abcdef|   zh|
|abcdfgrtyu|   zt|
|     pqlmn|   xl|
+----------+-----+

0
投票

enter code here
pyspark udf 代码中按最后一个分隔符分割

@F.udf(returnType=T.ArrayType(T.StringType())) def split_by_last_delm(str, 分隔符): 如果 str 为 None: 返回无 split_array = str.rsplit(分隔符, 1)

return split_array

data = data.withColumn("Part 1",split_by_last_delm(data["foo"],lit('_')).getItem(0))
data2 = data.withColumn("Part 2",split_by_last_delm(data["foo"],lit('_')).getItem(1))
© www.soinside.com 2019 - 2024. All rights reserved.