用另一个数据帧pyspark中的值替换/查找spark df中一列的值

用另一个数据帧pyspark中的值替换/查找spark df中一列的值,pyspark,vectorization,data-science,Pyspark,Vectorization,Data Science,我有一个带有令牌列表的数据帧 data1 = [(1, ["This","is", "category", "A"]), (2, ["This", "is", "category", "B","This", "is", "category", "B"]), (3, ["This", "is", "category", "F","This", "is", "category", "C"])] df2=spark.createDataFrame(data1).withColu

我有一个带有令牌列表的数据帧

data1 = [(1,  ["This","is", "category", "A"]),
    (2,  ["This", "is", "category", "B","This", "is", "category", "B"]),
    (3,  ["This", "is", "category", "F","This", "is", "category", "C"])]

df2=spark.createDataFrame(data1).withColumnRenamed('_1','category').withColumnRenamed('_2','tokens')
我有另一个数据帧,带有标记和它们的向量表示。这是第二个的模式

StructType(List(StructField(word,StringType,true),StructField(vector,ArrayType(DoubleType,true),true)))

word  vector
you   [0.04986, 0.5678]
我想用矢量表示法在数据框中查找标记列表,并计算pyspark中的平均值

请让我知道如何在pyspark中有效地执行此操作

python/panda中的逻辑是per


可以有多种方法来实现这一点。我可以带你走一条我通常更愿意走的路

第1步: 将第二个数据帧转换为地图并广播对象。。在scala中提供一个示例

val map = df.collect().map(r => r.getString(0) -> r.getString(1)) 
val broadcasted_map = sc.broadcast(map)
第2步: 创建UDF函数以执行所需的平均值操作,在UDF函数中,您可以使用broadcasted_map.values.get(“word”)访问广播地图


由于映射是广播的,因此它将在所有工作节点中可用,并且查找是节点的本地查找,不涉及洗牌。

可以有多种方法来实现这一点。我可以带你走一条我通常更愿意走的路

第1步: 将第二个数据帧转换为地图并广播对象。。在scala中提供一个示例

val map = df.collect().map(r => r.getString(0) -> r.getString(1)) 
val broadcasted_map = sc.broadcast(map)
第2步: 创建UDF函数以执行所需的平均值操作,在UDF函数中,您可以使用broadcasted_map.values.get(“word”)访问广播地图


由于映射是广播的,它将在所有工作节点中可用,并且查找是节点本地的,不涉及洗牌。

Hi@Naresh Krishnamoorthy,感谢您的回复当前我正在使用udf,并将尝试向所有执行者广播字典。我想知道有没有其他方法可以不在pyspark中使用numpy来翻译平均逻辑?我遇到了Word2VecModel.scala转换逻辑,我觉得它正在做类似的操作来实现嵌入。我试着翻译了几篇文章,但我在pyspark方面并不擅长。嗨@Naresh Krishnamoorthy,谢谢你的回复。目前我正在使用udf,并将尝试向所有执行者广播该词典。我想知道有没有其他方法可以不在pyspark中使用numpy来翻译平均逻辑?我遇到了Word2VecModel.scala转换逻辑,我觉得它正在做类似的操作来实现嵌入。我试着翻译了几篇文章,但我的Pypark能力不强。
val udf_function = udf((token: String) => {
// place your mean function here and access map here for word lookup
})
df.withcolumn("mean_value", udf_function(col("tokens"))) //add your transformation column