【问题标题】:Dot product in pyspark dataframes with MLLIB带有 MLLIB 的 pyspark 数据帧中的点积
【发布时间】:2019-09-20 21:15:10
【问题描述】:

我在 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 对象上调用?

【问题讨论】:

    标签: python apache-spark pyspark apache-spark-mllib


    【解决方案1】:

    在这里,您将dot 方法应用于列而不是DenseVector,这确实不起作用:

    df_offers = df_offers.withColumn("c", col("a").dot(col("b")))
    

    您必须使用 udf :

    from pyspark.sql.functions import udf, array
    from pyspark.sql.types import DoubleType
    
    def dot_fun(array):
        return array[0].dot(array[1])
    
    dot_udf = udf(dot_fun, DoubleType())
    
    df_offers = df_offers.withColumn("c", dot_udf(array('a', 'b')))
    

    【讨论】:

    • 让我大吃一惊的是 Spark 开发人员还没有开发出解决这个问题的方法。
    【解决方案2】:

    没有。您必须使用 udf:

    from pyspark.sql.functions import udf
    
    @udf("double")
    def dot(x, y):
        if x is not None and y is not None:
            return float(x.dot(y))
    

    【讨论】:

      【解决方案3】:

      您可以在不使用 UDF 的情况下将两列相乘,方法是先将它们转换为 BlockMatrix,然后将它们相乘,如下例所示

      
      from pyspark.mllib.linalg.distributed import IndexedRow, IndexedRowMatrix
      
      ac = offer_row.select('a')
      bc = offer_row.select('a')
      mata = IndexedRowMatrix(ac.rdd.map(lambda row: IndexedRow(*row)))
      matb = IndexedRowMatrix(bc.rdd.map(lambda row: IndexedRow(*row)))
      
      ma = mata.toBlockMatrix(100,100)
      mb = matb.toBlockMatrix(100,100)
      
      ans = ma.multiply(mb.transpose())
      
      

      【讨论】:

        猜你喜欢
        • 2016-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-14
        • 2023-04-01
        • 2017-08-31
        • 1970-01-01
        相关资源
        最近更新 更多