我在pyspark中有一个非常简单的框架,类似于这样:
from pyspark.sql import Row
from pyspark.mllib.linalg import DenseVector
row = Row("a", "b")
df = spark.sparkContext.parallelize([
offer_row(DenseVector([1, 1, 1]), DenseVector([1, 0, 0])),
]).toDF()
字符串
我想计算这些向量的点积,而不需要调用UDF。
spark MLLIB documentation引用了DenseVectors
上的dot
方法,但如果我尝试按如下方式应用它:
df_offers = df_offers.withColumn("c", col("a").dot(col("b")))
型
我得到的错误如下:
TypeError: 'Column' object is not callable
型
有谁知道这些mllib方法是否可以在DataFrame对象上调用?
5条答案
按热度按时间zf9nrax11#
在这里,您将
dot
方法应用于列而不是DenseVector
,这确实不起作用:字符串
你必须使用一个udf:
型
9rnv2umw2#
没有。你必须使用udf:
字符串
2vuwiymt3#
您可以在不使用UDF的情况下将两列相乘,方法是先将它们转换为BlockMatrix,然后像下面的示例那样将它们相乘
字符串
zzlelutf4#
这是一个hack,但可能比Python udf性能更好。你可以把点积转换成SQL:
字符串
hc2pp10m5#
作为对第一个答案的评论,我现在得到的是:
AttributeError: 'list' object has no attribute 'dot'
。即使我调用
np.dot(a, b)
,也总是有一个类型错误。类似于:Job aborted due to stage failure: Task 0 in stage 225.0 failed 4 times, most recent failure: ... : net.razorvine.pickle.PickleException: expected zero arguments for construction of ClassDict (for numpy.dtype)
个我不得不将返回值更改为item(),这样它就不再在numpy中了。工作解决方案:
字符串