Матрица подобия с использованием искрового фрейма данных - PullRequest
0 голосов
/ 15 мая 2018

Для входа Dataframe намерение состоит в том, чтобы генерировать только половину само декартового произведения. Учитывая, что декартово произведение приводит к симметричной матрице, нам действительно нужно вычислить либо верхнюю, либо нижнюю треугольную часть выше (соответственно ниже) диагонали, которая установлена ​​в нули:

Фрейм данных crossjoin:

val df3 = df2.crossJoin(df2)

сгенерирует FULL - который мы не хотим.

Учитывая, что матрица подобия симметрична единицам по диагонали, нам не нужно вычислять верхнюю половину или саму диагональ - как показано в НИЖЕ DiagO ниже:

enter image description here

Любые предложения о том, как получить результат с наименьшими вычислениями?

1 Ответ

0 голосов
/ 15 мая 2018

Следующий ответ не является идеальным: в результате сначала создается полный продукт 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...