首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一次UDF到电火花数据集的子集

一次UDF到电火花数据集的子集
EN

Stack Overflow用户
提问于 2018-06-20 07:32:47
回答 1查看 389关注 0票数 2

我有如下所示的Dataframe,包含两个排序的字符串列表,用于每个可能的key1key2组合。

代码语言:javascript
复制
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'|
|...

现在我想申请一个像这样的游戏:

代码语言:javascript
复制
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相似度。如果任何人有一个(更好的)建议,如何用火花放电做这件事,我会真的应用它!谢谢:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-20 08:40:57

你可以这样接近,

代码语言:javascript
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50942685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档