apache-spark - 将字符串列中的字数总和与另一列中的值进行比较
问题描述
我有一个由 3 列组成的 spark DataFrame text1
:text2
和number
.
我想根据以下约束过滤此 DataFrame:
(len(text1)+len(text2))>number
wherelen
返回 intext1
或 in的单词数text2
。
我尝试了以下方法:
common_df = common_df.filter((len(common_df["text1"].str.split(" ")) + len(common_df["text2"].str.split(" "))) > common_df["number"])
但它不工作。我得到以下异常:
TypeError: 'Column' object is not callable
这是我的输入示例:
text1 text2 number
bla bla bla no 2
解决方案
pyspark.sql.functions.length()
返回字符串的字符长度。如果要计算单词,可以使用split()
and size()
:
看起来您正在寻找:
from pyspark.sql.functions import col, size, split
common_df.where(
(size(split(col("text1"), "\s+")) + size(split(col("text2"), "\s+"))) > col("number")
).show()
首先,您在模式上拆分字符串,该模式\s+
是任意数量的空白字符。然后你取结果数组的大小。
如果您打算重复调用它,您还可以定义一个函数:
def numWords(column):
return size(split(column, "\s+"))
common_df.where((numWords(col("text1")) + numWords(col("text2"))) > col("number")).show()
推荐阅读
- python - 如何在 PySimpleGUI 中美化结果
- linux - 在 Ubuntu 上自动重启 MongoDB
- grpc - 为什么grpc-go可以在同一个地址和端口运行grpc server和http server,而grpc-node不能
- r - 插入符号包未加载
- java - JFreeChart 堆叠水平条形图中的错误
- ffmpeg - FFMPEG tee muxer 给出“输出文件 #0 不包含任何流”
- azure-devops - 将 bash 命令输出设置为 azure yml 变量
- mysql - Flask Security Too Mysql连接问题
- templates - 使用 MarkoJS 从字符串而不是文件进行渲染
- vue.js - JEST 预期:true 收到:false