gpt4 book ai didi

python - 将数据框列和外部列表传递给 withColumn 下的 udf

转载 作者:太空狗 更新时间:2023-10-29 17:00:41 25 4
gpt4 key购买 nike

我有一个具有以下结构的 Spark 数据框。 bodyText_token 具有标记(已处理/单词集)。我有一个定义关键字的嵌套列表

root
|-- id: string (nullable = true)
|-- body: string (nullable = true)
|-- bodyText_token: array (nullable = true)

keyword_list=[['union','workers','strike','pay','rally','free','immigration',],
['farmer','plants','fruits','workers'],['outside','field','party','clothes','fashions']]

我需要检查每个关键字列表下有多少标记,并将结果添加为现有数据框的新列。例如:if tokens =["become", "farmer","rally","workers","student"]结果将是 -> [1,2,0]

以下功能按预期工作。

def label_maker_topic(tokens,topic_words):
twt_list = []
for i in range(0, len(topic_words)):
count = 0
#print(topic_words[i])
for tkn in tokens:
if tkn in topic_words[i]:
count += 1
twt_list.append(count)

return twt_list

我在 withColumn 下使用 udf 访问该函数,但出现错误。我认为这是关于将外部列表传递给 udf。有没有一种方法可以将外部列表和数据框列传递给 udf 并向我的数据框添加一个新列?

topicWord = udf(label_maker_topic,StringType())
myDF=myDF.withColumn("topic_word_count",topicWord(myDF.bodyText_token,keyword_list))

最佳答案

最干净的解决方案是使用闭包传递额外的参数:

def make_topic_word(topic_words):
return udf(lambda c: label_maker_topic(c, topic_words))

df = sc.parallelize([(["union"], )]).toDF(["tokens"])

(df.withColumn("topics", make_topic_word(keyword_list)(col("tokens")))
.show())

这不需要对 keyword_list 或您用 UDF 包装的函数进行任何更改。您还可以使用此方法传递任意对象。这可用于传递例如 sets 列表以进行高效查找。

如果您想使用当前的 UDF 并直接传递 topic_words,您必须先将其转换为列文字:

from pyspark.sql.functions import array, lit

ks_lit = array(*[array(*[lit(k) for k in ks]) for ks in keyword_list])
df.withColumn("ad", topicWord(col("tokens"), ks_lit)).show()

根据您的数据和要求,可以选择更高效的解决方案,这些解决方案不需要 UDF(分解 + 聚合 + 折叠)或查找(哈希 + 向量运算)。

关于python - 将数据框列和外部列表传递给 withColumn 下的 udf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37409857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com