根据pyspark中另一列的值拆分一个列

时间:2019-04-08 15:37:21

标签: apache-spark pyspark pyspark-sql

我有以下数据框

+----+-------+
|item|   path|
+----+-------+
|   a|  a/b/c|
|   b|  e/b/f|
|   d|e/b/d/h|
|   c|  g/h/c|
+----+-------+

我想通过在列"item"中找到它的值来找到列 'path' 的相对路径,如下所示提取路径的LHS

+----+-------+--------+
|item|   path|rel_path|
+----+-------+--------+
|   a|  a/b/c|       a|
|   b|  e/b/f|     e/b|
|   d|e/b/d/h|   e/b/d|
|   c|  g/h/c|   g/h/c|
+----+-------+--------+

我尝试使用函数 split((str, pattern) regexp_extract(str, pattern, idx),但不确定如何将列'item'的值传递到其模式部分。知道不编写函数怎么办?

2 个答案:

答案 0 :(得分:2)

您可以使用pyspark.sql.functions.exprpass a column value as a parameterregexp_replace。在这里,您需要将item的负向后缀与.+连接起来,以匹配之后的所有内容,并替换为空字符串。

from pyspark.sql.functions import expr

df.withColumn(
    "rel_path", 
    expr("regexp_replace(path, concat('(?<=',item,').+'), '')")
).show()
#+----+-------+--------+
#|item|   path|rel_path|
#+----+-------+--------+
#|   a|  a/b/c|       a|
#|   b|  e/b/f|     e/b|
#|   d|e/b/d/h|   e/b/d|
#|   c|  g/h/c|   g/h/c|
#+----+-------+--------+

答案 1 :(得分:1)

您可以结合使用substringinstr

获得所需的结果。

substring-从列/字符串中获取子集

instr-标识特定模式在搜索字符串中的位置。

df = spark.createDataFrame([('a','a/b/c'),
                            ('b','e/b/f'),
                            ('d','e/b/d/h'),
                            ('c','g/h/c')],'item : string , path : string')

from pyspark.sql.functions import expr, instr, substring

df.withColumn("rel_path",expr("substring(path, 1, (instr(path,item)))")).show()

##+----+-------+--------+
##|item|   path|rel_path|
##+----+-------+--------+
##|   a|  a/b/c|       a|
##|   b|  e/b/f|     e/b|
##|   d|e/b/d/h|   e/b/d|
##|   c|  g/h/c|   g/h/c|
##+----+-------+--------+