PySpark如何基于复杂JSON单个字段中的关键词过滤DataFrame行
问题根因
你现有代码的核心错误是错误地将列名作为字符串常量传入lower()函数,而非传入列对象:
你写的lower("composition")是把字符串字面量"composition"转为小写,计算结果永远是固定字符串"composition",自然不可能匹配到包含electronic circuits的内容,所以返回空结果。
场景1:使用PySpark DataFrame
首先导入列操作依赖的函数,正确引用列对象即可:
# 先导入需要的函数 from pyspark.sql.functions import col, lower # 正确写法1:用col()明确指定列 ds = df_concat.filter(lower(col("composition")).like("%electronic circuits%")) # 正确写法2:用DataFrame.列名的方式引用 ds = df_concat.filter(lower(df_concat.composition).like("%electronic circuits%"))
如果遇到换行符导致匹配不到的情况,可以改用rlike正则匹配,正则默认支持跨行匹配:
ds = df_concat.filter(lower(col("composition")).rlike(".*electronic circuits.*"))
场景2:使用Pandas DataFrame
Pandas的filter方法是用来筛选列的,不是筛选行的,之前的写法完全不适用,应该用布尔索引实现:
# 不区分大小写的匹配写法 ds = df_concat[df_concat["composition"].str.contains("electronic circuits", case=False, na=False)]
其中case=False表示忽略大小写,na=False表示如果字段为空默认返回不匹配,避免报错。
内容的提问来源于stack exchange,提问作者Smita Banerjee
相关产品推荐
相关产品推荐

