我想计算子字符串列表的出现次数,并基于pyspark df中包含一个长字符串的列创建一个列。在
Input:
ID History
1 USA|UK|IND|DEN|MAL|SWE|AUS
2 USA|UK|PAK|NOR
3 NOR|NZE
4 IND|PAK|NOR
lst=['USA','IND','DEN']
Output :
ID History Count
1 USA|UK|IND|DEN|MAL|SWE|AUS 3
2 USA|UK|PAK|NOR 1
3 NOR|NZE 0
4 IND|PAK|NOR 1
Tags:
其思想是根据这三个
delimiters
:lst=['USA','IND','DEN']
拆分字符串,然后计算生成的子字符串的数量。在例如,字符串
USA|UK|IND|DEN|MAL|SWE|AUS
被拆分为-,
,|UK|
,|
,|MAL|SWE|AUS
。因为创建了4个子字符串,并且有3个分隔符匹配,所以4-1 = 3
给出了出现在列字符串中的这些字符串的计数。在我不确定Spark是否支持多字符分隔符,因此作为第一步,我们将列表} -
^{pr2}$['USA','IND','DEN']
中的这3个子字符串中的任何一个替换为一个标志/伪值%
。你也可以用别的东西。以下代码执行此操作^{最后,我们计算由^{} 创建的子字符串的数量,首先使用} 函数创建的子字符串的数量,最后从中减去1。在
%
作为分隔符,然后计算使用^{如果您使用的是Spark 2.4+,可以尝试Spark SQL高阶函数^{} :
其中我们首先将字段
^{pr2}$History
拆分为一个名为data
的数组列,然后使用filter函数:为了只检索满足条件的数组元素:
IN ("USA", "IND", "DEN")
,之后,我们使用size()
函数对结果数组进行计数。在更新:添加了另一种使用array_contains()的方法,该方法应适用于旧版本Spark:
注意:将跳过数组中的重复项,此方法只计算唯一的国家/地区代码。在
相关问题 更多 >
编程相关推荐