Spark Dataframe-Python-计算字符串中的子字符串

时间:2018-07-20 20:36:01

标签: python string apache-spark pyspark

我有一个Spark数据框,其中包含一列类型为string的“ assigned_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("+"))

我正在运行Apache Spark 2.3.1的群集上的Azure Databricks中运行代码。

3 个答案:

答案 0 :(得分:2)

这是一个非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|
+--------------------+------------------------+

答案 1 :(得分:0)

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")))

答案 2 :(得分:0)

Replace 会将出现的子字符串替换为空字符串。所以我们可以通过比较替换前后的长度来统计出现次数,如下所示:

使用 SparkSQL:

SELECT length(x) - length(replace(x,'+')) as substring_count
FROM  (select 'abc+def+ghi++aaa' as x) -- Sample data

输出:

substring_count
---------------
4

使用 PySpark 函数:

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|
+----------------+---------------+