PySpark 计数出现的次数,并用UDF创建一个新的列。

问题描述 投票:-1回答:1

我有一个数据框,里面有几列,包括 video_idtags.

我需要在我的df中创建一个新的列,叫做 occurrencias_music 字符串 "music "作为任何一个标签的子串出现的次数。不需要标签与 "music "完全相同,但必须包含它作为子串。

后来,我们的想法是实现一个 UDF subtag_music_UDFIntegerType() 并将传统的python函数 subcadena_en_vector(tags):

from pyspark.sql import functions as F
from pyspark.sql import types as T

subtag_music_UDF = F.udf(subcadena_en_vector, T.IntegerType())
df = df.withColumn("ocurrencias_music", subtag_music_UDF(F.col("tags")))

为此,我需要一个名为 subcadena_en_vector(tags)它应该接收一个字符串列表作为参数,并检查向量中有多少元素包含 "音乐 "这个词的子串。我必须用这个列表来测试它的操作。

["a life in music", "music for life", "bso", "hans zimmer"]

结果是2.

我有一个想法,什么是 "音乐"?subcadena_en_vector(tags) 函数可以是。

def subcadena_en_vector(tags, strToSearch):
    nTimes = 0
    for item in tags:
        #print(item.split())
        for subitem in item.split():
            if subitem==strToSearch:
                nTimes += 1

    return nTimes

if __name__ == "__main__":
  tags = ["a life in music", "music for life", "bso", "hans zimmer"]
  palabra = 'music'
  print(cuenta(tags,palabra)

这个函数的问题是,在后面的修正部分,其中包含了这个断言,我得到以下错误:

assert(subcadena_en_vector(["a life in music", "music for life", "bso", "hans zimmer"]) == 2)

我得到了以下错误。

> TypeErrorTraceback (most recent call last)
> <ipython-input-3-7a51ae031d9e> in <module>()
> ----> 1 assert(subcadena_en_vector(["a life in music", "music for life", "bso", "hans zimmer"]) == 2) TypeError: subcadena_en_vector()
> takes exactly 2 arguments (1 given)

有什么办法能让我简化这个函数,使它能完成出现次数的计算,而不会出现参数错误?

先谢谢你。

pyspark split count user-defined-functions assert
1个回答
-1
投票

我终于通过这样做解决了这个问题。

from pyspark.sql import functions as F
from pyspark.sql import types as T
from pyspark.sql import Window

subtag_music = ["a life in music", "music for life", "bso", "hans zimmer"]

def subcadena_en_vector(tags):
    return(sum([1 for c in tags if "music" in c]))

print(subcadena_en_vector(subtag_music))

subtag_music_UDF = F.udf(subcadena_en_vector, T.IntegerType())
videosOcurrenciasMusicDF = videosDiasViralDF.withColumn("ocurrencias_music", subtag_music_UDF(F.col("tags")))

谢谢!

© www.soinside.com 2019 - 2024. All rights reserved.