在 pyspark SQL DataFrame 中乘以稀疏向量行
Multiplying rows of Sparse vectors in pyspark SQL DataFrame
我在乘以 SQL 数据框中的列元素时遇到困难。
sv1 = Vectors.sparse(3, [0, 2], [1.0, 3.0])
sv2 = Vectors.sparse(3, [0, 1], [2.0, 4.0])
def xByY(x,y):
return np.multiply(x,y)
print(xByY(sv1, sv2))
以上有效。
但下面没有。
xByY_udf = udf(xByY)
tempDF = sqlContext.createDataFrame([(sv1, sv2), (sv1, sv2)], ('v1', 'v2'))
tempDF.show()
print(tempDF.select(xByY_udf('v1', 'v2')).show())
非常感谢!
如果你想让你的udf
变成return一个SparseVector
,我们首先需要修改你函数的输出,然后设置[=的输出模式12=] 到 VectorUDT()
:
要声明一个SparseVector
,我们需要原始数组的大小,以及索引和值 非零 元素。如果乘法的中间结果是 list
:
,我们可以使用 len()
和列表理解找到这些
from pyspark.ml.linalg import Vectors, VectorUDT
def xByY(x,y):
res = np.multiply(x,y).tolist()
vec_args = len(res), [i for i,x in enumerate(res) if x != 0], [x for x in res if x != 0]
return Vectors.sparse(*vec_args)
现在我们可以声明我们的 udf
并测试它:
xByY_udf = udf(xByY, VectorUDT())
tempDF.select(xByY_udf('v1', 'v2')).show()
+-------------+
| xByY(v1, v2)|
+-------------+
|(3,[0],[2.0])|
|(3,[0],[2.0])|
+-------------+
我在乘以 SQL 数据框中的列元素时遇到困难。
sv1 = Vectors.sparse(3, [0, 2], [1.0, 3.0])
sv2 = Vectors.sparse(3, [0, 1], [2.0, 4.0])
def xByY(x,y):
return np.multiply(x,y)
print(xByY(sv1, sv2))
以上有效。
但下面没有。
xByY_udf = udf(xByY)
tempDF = sqlContext.createDataFrame([(sv1, sv2), (sv1, sv2)], ('v1', 'v2'))
tempDF.show()
print(tempDF.select(xByY_udf('v1', 'v2')).show())
非常感谢!
如果你想让你的udf
变成return一个SparseVector
,我们首先需要修改你函数的输出,然后设置[=的输出模式12=] 到 VectorUDT()
:
要声明一个SparseVector
,我们需要原始数组的大小,以及索引和值 非零 元素。如果乘法的中间结果是 list
:
len()
和列表理解找到这些
from pyspark.ml.linalg import Vectors, VectorUDT
def xByY(x,y):
res = np.multiply(x,y).tolist()
vec_args = len(res), [i for i,x in enumerate(res) if x != 0], [x for x in res if x != 0]
return Vectors.sparse(*vec_args)
现在我们可以声明我们的 udf
并测试它:
xByY_udf = udf(xByY, VectorUDT())
tempDF.select(xByY_udf('v1', 'v2')).show()
+-------------+
| xByY(v1, v2)|
+-------------+
|(3,[0],[2.0])|
|(3,[0],[2.0])|
+-------------+