bugfix> scala > 投稿

入力 Dataframe の場合その目的は、自己デカルト積の半分のみを生成することです。デカルト積の結果が対称行列になる場合、ゼロに設定された対角線の上(または下)の上三角部分または下三角部分を計算するだけで十分です。

データフレーム crossjoin

val df3 = df2.crossJoin(df2)

生成します満杯 -私たちは望んでいません。

類似度行列が対角線に沿って1で対称であるとすると、上半分または対角線自体を計算する必要はありません-LOWER DiagO 未満:

最小の計算で結果を取得する方法に関する提案はありますか?

回答 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
    
    

あなたの答え