У меня есть фрейм данных Spark со столбцом («assign_products») строки типа, который содержит такие значения, как следующие:
"POWER BI PRO+Power BI (free)+AUDIO CONFERENCING+OFFICE 365 ENTERPRISE E5 WITHOUT AUDIO CONFERENCING"
Я хотел бы подсчитать количество вхождений "+" в строке и вернуть это значение в новом столбце.
Я пробовал следующее, но продолжаю возвращать ошибки.
from pyspark.sql.functions import col
DF.withColumn('Number_Products_Assigned', col("assigned_products").count("+"))
Я запускаю свой код в Azure Databricks в кластере под управлением Apache Spark 2.3.1.






from pyspark.sql.functions import col,udf
@udf(returnType='int')
def cnt(s):
return s.count('+')
DF.withColumn('Number_Products_Assigned', cnt(col("assigned_products")))
Вот решение, отличное от udf. Разделите свою строку на символ, который вы пытаетесь подсчитать, и желаемое значение - это длина результирующего массива минус 1:
from pyspark.sql.functions import col, size, split
DF.withColumn('Number_Products_Assigned', size(split(col("assigned_products"), r"\+")) - 1)
Вам нужно избежать +, потому что это специальный символ регулярного выражения.
+--------------------+------------------------+
| assigned_products|Number_Products_Assigned|
+--------------------+------------------------+
|POWER BI PRO+Powe...| 3|
+--------------------+------------------------+
Заменить заменит вхождение подстроки пустой строкой. Таким образом, мы можем подсчитать количество вхождений, сравнив длину до и после замены следующим образом:
SELECT length(x) - length(replace(x,'+')) as substring_count
FROM (select 'abc+def+ghi++aaa' as x) -- Sample data
Выход:
substring_count
---------------
4
import pyspark.sql.functions as F
df1 = spark.sql("select 'abc+def+ghi++aaa' as x") # Sample data
df1.withColumn('substring_count',
F.length(col('x'))
- F.length(F.regexp_replace(col('x'), '\+', ''))
).show()
Выход:
+----------------+---------------+
| x|substring_count|
+----------------+---------------+
|abc+def+ghi++aaa| 4|
+----------------+---------------+
Я ценю вклад! Работает как шарм!