regex 在pyspark Dataframe 上查找正则表达式匹配

yks3o0rb  于 2023-01-03  发布在  Spark
关注(0)|答案(1)|浏览(152)

我有一个如下的pyspark数据框

+---+-------------------------------------------------------------------------------+
|id |strval                                                                         |
+---+-------------------------------------------------------------------------------+
|1  |{"position":"left","title":"journeys","link":"https://www.abcd.com","rank":549}|
|2  |{"position":"left","title":"journeys","link":"https://www.abcd.com","rank":5}  |
+---+-------------------------------------------------------------------------------+

我只想使用我在下面代码中尝试过的regexp来查找rank的值

select id,
regexp_extract("strval", '(\"rank\":)(\d+)',2) as rn
from tbl

但是我得到的只是空的值。有人能指导我实现这一点吗?

jdgnovmf

jdgnovmf1#

这里你应该避免使用regex,而是应该 parse 你的JSON内容来提取rank键。假设你使用的是PySpark 1.6+,我们可以尝试:

from pyspark.sql.functions import get_json_object

df = df.withColumn("rank", get_json_object(df.strval, f'$.rank'))

假设您想继续通过Spark SQL解决这个问题,那么您已经走上了正确的道路。我建议不要将列名放在双引号中,因为这可能会被误认为是字符串文字。此外,您只需要使用一个捕获组来表示数字排名:

SELECT id,
       REGEXP_EXTRACT(strval, '"rank":(\d+)', 1) AS rn
FROM tbl;

相关问题