使用正则表达式提取

时间:2020-08-01 19:29:34

标签: python regex pyspark

我正在使用pyspark和regex_extract创建新列:

df.withColumn("go", F.regexp_extract("fields", '"go":"([A-Za-z0-9]*)"', 1))

“字段”是一栏,其中包含教义值。其中的值如下:

{"go":"NEW123", "hey":"OLD32", "go":"BYE89"}

问题是在“字段”中有两个“执行”。使用上面的代码,它返回第一个值(“ NEW123”)。我只想返回第二个值(所以我想返回“ BYE89”)。我该怎么办?

谢谢!

1 个答案:

答案 0 :(得分:1)

尝试使用 "go".*?"go":"(.*)" 正则表达式。

df.withColumn("go",regexp_extract(col("fields"),'"go".*?"go":"(.*)"',1)).show(10,False)
df.withColumn("go",regexp_extract(col("fields"),'"go".*?"go":"([A-Za-z0-9]*)"',1)).show(10,False)
#+--------------------------------------------+-----+
#|fields                                      |go   |
#+--------------------------------------------+-----+
#|{"go":"NEW123", "hey":"OLD32", "go":"BYE89"}|BYE89|
#+--------------------------------------------+-----+

另一种方法是使用 from_json function

第二次出现的go将覆盖第一次出现的(与python dict相同),因此,我们对 go 仅有一个值。

df.show(10,False)
#+--------------------------------------------+
#|fields                                      |
#+--------------------------------------------+
#|{"go":"NEW123", "hey":"OLD32", "go":"BYE89"}|
#+--------------------------------------------+

from pyspark.sql.types import *
from pyspark.sql.functions import *

sch=StructType([StructField("go",StringType()),StructField("hey",StringType())])

df.withColumn("go",from_json(col("fields"),sch)).\
withColumn("go",col("go.go")).show(10,False)
#+--------------------------------------------+-----+
#|fields                                      |go   |
#+--------------------------------------------+-----+
#|{"go":"NEW123", "hey":"OLD32", "go":"BYE89"}|BYE89|
#+--------------------------------------------+-----+
相关问题