Scala 使用spark数据帧的相似矩阵

Scala 使用spark数据帧的相似矩阵,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,对于输入数据帧,目的是只生成一半的自笛卡尔积。考虑到笛卡尔积在对称矩阵中的结果,我们只需要计算对角线上方或下方设置为零的上三角部分或下三角部分: 数据帧交叉连接: 将生成我们不想要的完整的 假设相似矩阵沿对角线对称,我们不需要计算上半部分或对角线本身-如下图所示: 对于如何以最少的计算量获得结果,有什么建议吗 以下不是一个完美的答案:它确实会首先生成完整的笛卡尔积。但至少输出结果是正确的 /** Generate schema for cartesian product of an input

对于输入数据帧,目的是只生成一半的自笛卡尔积。考虑到笛卡尔积在对称矩阵中的结果,我们只需要计算对角线上方或下方设置为零的上三角部分或下三角部分:

数据帧交叉连接:

将生成我们不想要的完整的

假设相似矩阵沿对角线对称,我们不需要计算上半部分或对角线本身-如下图所示:


对于如何以最少的计算量获得结果,有什么建议吗

以下不是一个完美的答案:它确实会首先生成完整的笛卡尔积。但至少输出结果是正确的

/** 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
/** 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