【问题标题】: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