次のテーブルを処理しています。他の2つの列の個別の値に基づいて、新しい列(結果)を計算したいと思います。
| 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
この場合、ここでは役に立たないようです。
ここでのロジックは、の一意の値ごとに、対応する値1が割り当てられているid1
min(id2
)で結果に番号を付け始めるid1
ことです。
あなたはdense_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()
出力
+---+---+-------+
|id1|id2|outcome|
+---+---+-------+
| 2| 5| 1|
| 1| 1| 1|
| 1| 1| 1|
| 1| 3| 2|
| 3| 1| 1|
| 3| 2| 2|
| 3| 3| 3|
+---+---+-------+
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加