我有如下所示的Dataframe,包含两个排序的字符串列表,用于每个可能的key1和key2组合。
df=
+----+------------+-------+-------+
|key1| key2| value1| value2|
+----+------------+-------+-------+
| 'a'| '10,0,10' | 'abc'| 'abc'|
| 'a'| '10,0,10' | 'aab'| 'aab'|
| 'a'| '10,0,10' | 'acb'| 'acb'|
| 'a'| '10,0,20' | 'abc'| 'abc'|
| 'a'| '10,0,20' | 'acb'| 'aab'|
| 'a'| '10,0,20' | 'aab'| 'acb'|
| 'b'| '10,0,10' | 'bcd'| 'bcd'|
| 'b'| '10,0,10' | 'bbc'| 'bdc'|
| 'b'| '10,0,10' | 'bdc'| 'bbc'|
|...现在我想申请一个像这样的游戏:
for c in [x for x in df.select('key1').distinct().collect()]:
for s in [x for x in df.select('key2').distinct().collect()]:
jaccard_sim([x for x in df.select('value1').filter(df['key1']==c).filter(df['key2']==s).collect()],
[x for x in df.select('value2').filter(df['key1']==c).filter(df['key2']==s).collect()])但是,由于我想使用sparks能力并行执行,我认为上面的实现可能有点愚蠢;)有人知道如何解决吗?
背景是,我有一个按key1和key2组合排序的列表(Key1)和key2组合,我想将其与每键1 (value2)的基准列表进行比较,并计算列表之间的jaccard相似度。如果任何人有一个(更好的)建议,如何用火花放电做这件事,我会真的应用它!谢谢:)
发布于 2018-06-20 08:40:57
你可以这样接近,
import pyspark.sql.functions as F
def convert_form(x):
print type(x)
val1 = [y['value1'] for y in x]
val2 = [y['value2'] for y in x]
return [val1, val2]
jaccard_udf = F.udf(lambda x: jaccard_sim(*convert_form(x)) ) #assuming you have jaccard_sim function
df = df.select('key1', 'key2', F.struct('value1','value2').alias('values'))\
.groupby('key1', 'key2').agg(F.collect_list('values').alias('collected_col'))\
.withColumn('jaccard_distance', jaccard_udf(F.col('collected_col')) )
df.show()https://stackoverflow.com/questions/50942685
复制相似问题