我正在使用pyspark和regex_extract创建新列:
df.withColumn("go", F.regexp_extract("fields", '"go":"([A-Za-z0-9]*)"', 1))
“字段”是一栏,其中包含教义值。其中的值如下:
{"go":"NEW123", "hey":"OLD32", "go":"BYE89"}
问题是在“字段”中有两个“执行”。使用上面的代码,它返回第一个值(“ NEW123”)。我只想返回第二个值(所以我想返回“ BYE89”)。我该怎么办?
谢谢!
答案 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|
#+--------------------------------------------+-----+