我正在尝试根据输入字符串是否在组中另一个字符串的开头为组中的每一行分配一个值。例如,“ hello”位于“ hello world”的开头,因此这两个都被分配了“ TOGETHER”值。没有为“再见”分配“ TOGETHER”值,因为它不在组中另一个字符串的开头。
input = [('1', 'hello'),('1', 'goodbye'),('1', 'hola'),('1', 'hi'),('1', 'hello world'),('1', 'hello world, goodbye'),('1', 'hello world, goodbye earth'),('2', 'bonjour'),('2', 'gracias'),('2','bonjour madame')]
spark.createDataFrame(input,['group','input']).show(10,truncate=False)
以下是输入内容:
下面是所需的输出:
我正在使用pyspark,但是如果有人知道如何在python中实现此功能,那么我可以将其翻译为pyspark。
答案 0 :(得分:1)
首先,我们使用“窗口”功能通过“ 组”列对DF进行分区。我们再次通过“ 输入”列中每个字符串的第一个单词对每个分组进行分组。我们使用 substring_index 函数来实现。创建窗口函数后,我们通过计算窗口函数创建的每个组的大小来向DF添加列-检查该组是否具有单行或更多行。
from pyspark.sql import Window
from pyspark.sql.functions import *
w = Window.partitionBy(df.group, substring_index(df.input, ' ', 1))
df.withColumn('output', when(count('*').over(w) > 1, 'TOGETHER').otherwise('STAND ALONE'))