我有一个页面浏览会话数据集。每个会话都有一个字符串,其中包含访问的URL(按顺序),这些URL由管道符号“ ||”分隔,例如“'www.abc.com/||www.abc.com/a/||b.abc.com /C/'”。我需要搜索包含以下URL的会话:“ www.abc.com/d/e/”。我有以下两段pyspark代码在所有会话中寻找该URL:
>>> df = spark.createDataFrame([('www.abc.com/||www.abc.com/a/||b.abc.com/c/',)], ['s',])
>>> df = df.withColumn('s', F.instr(F.regexp_replace(df.s, 'www.abc.com/d/e/\|\|', 'YOLO'), 'YOLO') > 0)
>>> df.collect()
[Row(s=False)]
正确。
>>> df = spark.createDataFrame([('www.abc.com/||www.abc.com/a/||b.abc.com/c/',)], ['s',])
>>> df.registerTempTable('df')
>>> path_filter = 'www.abc.com/d/e/\|\|'
>>> spark.sql(f'''
select instr(regexp_replace(s, "{path_filter}", "YOLO"), "YOLO") > 0 as s
from df''').collect()
[Row(s=True)]
错。
请注意,代码中的唯一区别是使用spark.sql(...)使用SQLish语法编写查询。但是,如您所见,上述示例的结果有所不同。谁能解释我的区别?
附加说明:
1.我要添加“ \ | \ |”到我要搜索的URL的末尾,因为更长的URL都以该URL作为前缀。
2.我先应用regexp_replace(),然后再应用instr(),因为稍后我想使用正则表达式来搜索会话中不同的URL组合。
3.我使用的是Spark版本v2.4.0.0-mapr-620。