<pre><code># Importing requisite packages and creating a DataFrame
from pyspark.sql.functions import split, col, size, regexp_replace
values = [(1,'USA|UK|IND|DEN|MAL|SWE|AUS'),(2,'USA|UK|PAK|NOR'),(3,'NOR|NZE'),(4,'IND|PAK|NOR')]
df = sqlContext.createDataFrame(values,['ID','History'])
df.show(truncate=False)
+ -+ +
|ID |History |
+ -+ +
|1 |USA|UK|IND|DEN|MAL|SWE|AUS|
|2 |USA|UK|PAK|NOR |
|3 |NOR|NZE |
|4 |IND|PAK|NOR |
+ -+ +
</code></pre>
<p>其思想是根据这三个<code>delimiters</code>:<code>lst=['USA','IND','DEN']</code>拆分字符串,然后计算生成的子字符串的数量。在</p>
<p>例如,字符串<code>USA|UK|IND|DEN|MAL|SWE|AUS</code>被拆分为-<code>,</code>,<code>|UK|</code>,<code>|</code>,<code>|MAL|SWE|AUS</code>。因为创建了4个子字符串,并且有3个分隔符匹配,所以<code>4-1 = 3</code>给出了出现在列字符串中的这些字符串的计数。在</p>
<p>我不确定Spark是否支持多字符分隔符,因此作为第一步,我们将列表<code>['USA','IND','DEN']</code>中的这3个子字符串中的任何一个替换为一个标志/伪值<code>%</code>。你也可以用别的东西。以下代码执行此操作<a href="http://spark.apache.org/docs/2.4.0/api/python/pyspark.sql.html#pyspark.sql.functions.regexp_replace" rel="nofollow noreferrer">^{<cd11>}</a>-</p>
^{pr2}$
<p>最后,我们计算由<a href="http://spark.apache.org/docs/2.4.0/api/python/pyspark.sql.html#pyspark.sql.functions.split" rel="nofollow noreferrer">^{<cd12>}</a>创建的子字符串的数量,首先使用<code>%</code>作为分隔符,然后计算使用<a href="http://spark.apache.org/docs/2.4.0/api/python/pyspark.sql.html#pyspark.sql.functions.size" rel="nofollow noreferrer">^{<cd14>}</a>函数创建的子字符串的数量,最后从中减去1。在</p>
<pre><code>df = df.withColumn('Count', size(split(col('History_X'), "%")) - 1).drop('History_X')
df.show(truncate=False)
+ -+ + -+
|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 |
+ -+ + -+
</code></pre>