Apache Spark вычисляет значение столбца на основе отдельного значения столбцов - PullRequest
2 голосов
/ 08 мая 2020

Я обрабатываю следующие таблицы и хотел бы вычислить новый столбец (результат) на основе отличного значения двух других столбцов.

| id1  | id2 | outcome
|  1   |  1  |  1
|  1   |  1  |  1
|  1   |  3  |  2
|  2   |  5  |  1 
|  3   |  1  |  1  
|  3   |  2  |  2
|  3   |  3  |  3

Результат должен начинаться в возрастающем порядке, начиная с 1, на основе комбинированного значения id1 и id2. Любые подсказки, как это можно сделать в Scala. row_number в данном случае, кажется, бесполезен.

Лог c здесь заключается в том, что для каждого уникального значения id1 мы начнем нумерацию результата с min (id2) для соответствующего id1 присваивается значение 1.

Ответы [ 2 ]

2 голосов
/ 08 мая 2020

Вы можете попробовать elastic_rank ()

в своем примере

      val df = sqlContext
        .read
        .option("sep","|")
        .option("header", true)
        .option("inferSchema",true)
        .csv("/home/cloudera/files/tests/ids.csv") // Here we read the .csv files
        .cache()

      df.show()
      df.printSchema()

      df.createOrReplaceTempView("table")
      sqlContext.sql(
        """
          |SELECT id1, id2, DENSE_RANK() OVER(PARTITION BY id1 ORDER BY id2) AS outcome
          |FROM table
          |""".stripMargin).show()

output

+---+---+-------+
|id1|id2|outcome|
+---+---+-------+
|  2|  5|      1|
|  1|  1|      1|
|  1|  1|      1|
|  1|  3|      2|
|  3|  1|      1|
|  3|  2|      2|
|  3|  3|      3|
+---+---+-------+
1 голос
/ 08 мая 2020

Используйте функцию Window, чтобы объединить (partition) их по first id, а затем order каждый partition на основе second id.

Теперь вам просто нужно назначить ранг ( dense_rank) по каждому разделу Window.

import org.apache.spark.sql.functions._
import org.apache.spark.sql.expressions.Window

df
.withColumn("outcome", dense_rank().over(Window.partitionBy("id1").orderBy("id2")))

...