【问题标题】:Similarity matrix using a spark dataframe使用火花数据框的相似度矩阵
【发布时间】:2018-05-15 04:54:59
【问题描述】:

对于输入Dataframe,其目的是仅生成一半的自笛卡尔积。鉴于笛卡尔积导致对称矩阵,我们只需要计算设置为零的对角线上方(相应下方)的上三角部分或下三角部分:

数据框crossjoin

val df3 = df2.crossJoin(df2)

将生成 FULL - 这是我们不想要的。

鉴于相似度矩阵沿对角线与 1 对称,我们不需要计算上半部分或对角线本身 - 如下 LOWER DiagO's 所示:

关于如何以最少的计算获得结果的任何建议?

【问题讨论】:

    标签: scala apache-spark apache-spark-sql


    【解决方案1】:

    以下不是一个完美的答案:它确实会导致首先生成完整的cartesian 产品。但至少输出结果是正确的。

    /** Generate schema for cartesian product of an input dataframe */
    def joinSchema(df: DataFrame) = 
      types.StructType(df.schema.fields.map {
        f => StructField(s"${f.name}_a", f.dataType, f.nullable)
      } ++ df.schema.fields.map { f => StructField(s"${f.name}_b", f.dataType, f.nullable)}
    )
    
    // Create the cartesian product via crossJoin
    val schema = joinSchema(dfIn)
    val df3 = df2.crossJoin(dfIn)
    val cartesianDf = spark.createDataFrame(df3.rdd, schema)
    
    cartDf.createOrReplaceTempView("cartesian")
    
    // Retain the lower triangular entries below the diagonal
    select * from cartesian where id_a < id_b
    

    【讨论】:

      猜你喜欢
      • 2018-04-10
      • 1970-01-01
      • 1970-01-01
      • 2017-10-19
      • 2021-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多