【问题标题】:pyspark count number of underscores in each row of a given columnpyspark count 给定列的每一行中的下划线数
【发布时间】:2018-07-20 20:39:56
【问题描述】:

我正在使用 pyspark 版本 1.5.2。我有一个带有“id”列的 pyspark dataframe,如下所示:

id
------------
000001_128
000123_1_3 
006745_8
000000_9_7

我想计算 DF 每一行中 '_'(下划线)的数量并执行 when 操作,如果字符串中只有 1 个下划线,我想添加 '_1' 作为后缀,否则保持原样。所以想要的结果是:

id          | new_id
------------------------
000001_128  | 000001_128_1
000123_1_3  | 000123_1_3
006745_8    | 006745_8_1
000000_9_7  | 000000_9_7

我正在使用 pyspark.sql.functions 进行其他操作。

感谢任何帮助!

【问题讨论】:

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


    【解决方案1】:

    这是一种非 udf 方法:

    您可以使用与this answer 相同的方法来计算每个id_ 的数量,并使用pyspark.sql.functions.when() 检查计数是否等于1。如果是,请使用pyspark.sql.functions.format_string() 来使new_id,否则保持列不变:

    import pyspark.sql.functions as f
    
    df.withColumn(
        "new_id",
        f.when(
            (f.size(f.split("id", "_"))-1) == 1,
            f.format_string("%s_1",f.col("id"))
        ).otherwise(f.col("id"))
    ).show()
    #+----------+------------+
    #|        id|      new_id|
    #+----------+------------+
    #|000001_128|000001_128_1|
    #|000123_1_3|  000123_1_3|
    #|  006745_8|  006745_8_1|
    #|000000_9_7|  000000_9_7|
    #+----------+------------+
    

    【讨论】:

    • 我很好奇,为什么使用 4 个 UDF(尽管是内置的)在 dfs 和常规类型之间来回传递数据比一个 udf 更好
    • @ArnonRotem-Gal-Oz 重要的是这些是内置的(不是用户定义的 python 函数)——这意味着所有的执行都可以在 JVM 内部进行( pyspark 毕竟只是包装器)。如果要使用 python udf,spark 必须序列化数据帧,以便可以执行 python 代码。 更新:查看this post了解更详细的说明。
    【解决方案2】:
    from pyspark.sql.functions import udf
    
    @udf(returnType='string')
    def fmt(s):
        return s if s.count('_')!=1 else f'{s}_1'
    
    
    df.withColumn('id', fmt(df.id))
    

    【讨论】:

      猜你喜欢
      • 2013-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-18
      • 2022-01-11
      • 2017-09-02
      相关资源
      最近更新 更多