【问题标题】:Count substring in string column using Spark dataframe使用 Spark 数据框计算字符串列中的子字符串
【发布时间】:2018-12-29 04:57:08
【问题描述】:

我有一个 Spark 数据框,其中有一列 (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 中运行我的代码。

【问题讨论】:

    标签: python string apache-spark pyspark apache-spark-sql


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:
      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")))
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2020-06-01
          • 2023-04-06
          • 2023-03-28
          • 1970-01-01
          • 1970-01-01
          • 2021-01-24
          • 2017-10-20
          • 1970-01-01
          相关资源
          最近更新 更多