Python 在PySpark中使用正则表达式创建N-Gram

Python 在PySpark中使用正则表达式创建N-Gram,python,regex,dataframe,apache-spark,pyspark,Python,Regex,Dataframe,Apache Spark,Pyspark,我有一个pyspark dataframe列,其名称为: | name | -------------- |Lebron James| |Kyrie Irving| |Kevin Durant| 我想创建一个新列,如下所示: | name | trigram | ----------------------------------------- |Lebron James| Leb ebr bro on Jam ame es |Kyr

我有一个pyspark dataframe列,其名称为:

|   name     |
--------------
|Lebron James|
|Kyrie Irving|
|Kevin Durant|
我想创建一个新列,如下所示:

|   name     |         trigram          |
-----------------------------------------
|Lebron James| Leb ebr bro on  Jam ame es
|Kyrie Irving| ...
|Kevin Durant| ...
到目前为止我有

df.withColumn("trigram", regex_replace(col("name"), "([A-Za-z0-9\s]{3})(?!$)", r"$1 "))
但这会产生:

|   name     |         trigram       |
--------------------------------------
|Lebron James| Leb ron Ja  mes
|Kyrie Irving| Kyr ie  Irv ing
|Kevin Durant| Kev in  Dur ant
注意:重要的是不要使用UDF。我可以简单地使用udf和列表理解来做我想做的事情,但我希望以最理想的方式来做,因为实际数据有数亿行可以使用

regex_replace(col(“name”),“(?=(.3})),r“$1”)
看。详情:

  • (?=(.{3}))
    -一个正向前瞻,捕捉当前位置右侧除换行符以外的三个字符(进入组1,
    $1
  • -除换行字符外的任何字符,已消耗(将被删除,并由从该字符开始的3字符条纹替换)

也许
regex_replace(col(“name”),“(?=(.3})),r“$1”)
可以吗?是的,这很有效,谢谢!我还是正则表达式的新手