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

时间:2020-04-21 23:54:36

标签: 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).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中的逻辑是根据http://nadbordrozd.github.io/blog/2016/05/20/text-classification-with-word2vec/

return np.array([
            np.mean([word2vec[w] for w in words if w in word2vec]
                    or [np.zeros(dim)], axis=0)
            for words in X

1 个答案:

答案 0 :(得分:0)

可能有多种方法可以实现这一目标。我可以带您通过我通常会喜欢的方式。

步骤1: 将第二个数据帧转换为Map并广播对象。.在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”)

访问广播的地图。
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

由于广播了地图,因此它将在所有辅助节点中可用,并且查找在该节点本地,并且不涉及随机播放。