我试图使用pyspark 2.2.0将每个矩阵行乘以给定向量中的相应元素。
例如在numpy
我可以这样做:
foo = np.array([[1,2,3], [4,5,6]])
bar = np.array([[2],[3]])
bar * foo
结果:
array([[ 2, 4, 6],
[12, 15, 18]])
请注意,我不想做点积。它只是将矩阵行中的每个元素乘以向量中的相应元素。
在pyspark 2.2.0中有没有办法做到这一点?我尝试了很多东西,却无法得到我想要的东西。我猜一个人可以用map
来做,但不知何故感觉不对。
有更好的方法吗?
答案 0 :(得分:2)
例如,您可以逐行连接两个数据帧,然后使用UDF
将ArrayType
的每个元素乘以IntegerType
:
首先让我们创建一个带有行索引的数据帧:
foo_df = sc.parallelize(foo.tolist()).zipWithIndex().toDF()
bar_df = sc.parallelize(bar.tolist()).zipWithIndex().toDF()
现在加入他们并获得最终结果:
import pyspark.sql.functions as psf
from pyspark.sql.types import ArrayType, IntegerType
mul = psf.udf(lambda xx,y: [x * y for x in xx], ArrayType(IntegerType()))
foo_df.join(bar_df, '_2')\
.select(mul(foo_df._1, bar_df._1[0]))\
.show()
+-------------------+
|<lambda>(_1, _1[0])|
+-------------------+
| [2, 4, 6]|
| [12, 15, 18]|
+-------------------+