2つの異なるタイムスタンプの人の値を保持する2つのデータフレームがあります。前後の人の可能な変更は、以下のコードに記載されています。異なるデータフレームからの行の変化を検出する方法
val before = Seq(
(1, "soccer", "1", "2", "3", "4", ""),
(2, "soccer", "", "", "", "", ""),
(3, "soccer", "1", "", "", "", ""),
(4, "soccer", "1", "", "", "", ""),
(5, "soccer", "1", "", "", "", ""),
(6, "soccer", "1", "", "", "", "")
).toDF("id", "sport", "var1", "var2", "var3", "var4", "var5")
before.show //> +---+------+----+----+----+----+----+
//| | id| sport|var1|var2|var3|var4|var5|
//| +---+------+----+----+----+----+----+
//| | 1|soccer| 1| 2| 3| 4| |
//| | 2|soccer| | | | | |
//| | 3|soccer| 1| | | | |
//| | 4|soccer| 1| | | | |
//| | 5|soccer| 1| | | | |
//| | 6|soccer| 1| | | | |
//| +---+------+----+----+----+----+----+
//|
val after = Seq(
(1, "soccer", "1", "2", "3", "4", ""), // Same
(2, "soccer", "1", "", "", "", ""), // Addition
(3, "soccer", "1", "1", "", "", ""), // Addition
(4, "soccer", "", "", "", "", ""), // Remove
(5, "soccer", "2", "1", "", "", ""), // Slide
(6, "soccer", "2", "", "", "", "") // Change
).toDF("id", "sport", "var1", "var2", "var3", "var4", "var5")
after.show //> +---+------+----+----+----+----+----+
//| | id| sport|var1|var2|var3|var4|var5|
//| +---+------+----+----+----+----+----+
//| | 1|soccer| 1| 2| 3| 4| |
//| | 2|soccer| 1| | | | |
//| | 3|soccer| 1| 1| | | |
//| | 4|soccer| | | | | |
//| | 5|soccer| 2| 1| | | |
//| | 6|soccer| 2| | | | |
//| +---+------+----+----+----+----+----+
//|
物事は同じままにすることができますが、追加や削除があり、最後に変更やスライドがある可能性があります。
私の理想的な出力を前にし、データフレームの後に、各行に直面し、ラベル添付するものです:
outcome.show //> +---+------+------+
//| | id| sport| diff|
//| +---+------+------+
//| | 1|soccer| same|
//| | 2|soccer| add|
//| | 3|soccer| add|
//| | 4|soccer|remove|
//| | 5|soccer| slide|
//| | 6|soccer|change|
//| +---+------+------+
//|
この質問はthis 1に関連しているのが、ポイントはどのように多くの違いをカウントするだけでした2つの行の間にありました...今度は、これらの違いを細かい穀粒で理解しようとしていますが、私はさまざまな可能なオプションを定義することに固執しています。
EDIT
私はデータフレームを使用しておりますので、私はこのような構造に固執するのではなくケースクラスを使用したいと思います。私は、代わりにDataFrameを使用して@ibossによって提案されたものを適応させようとしています。
私はすべての作業を行う必要があり、このUDFを持っている:
val diff = udf { (bef:DataFrame, aft:DataFrame) => {
"hello" // return just this string for now
} : String
}
このUDFは@ibossにより示唆されるようにoutcome.showで出力を生成するために、すべての作業を行うので、後の可能な結果になります2つの行を一致させると、より正確には "同じ"、 "追加"、 "削除"、 "スライド"または "変更"のいずれかの文字列になります。
私はその後、2つのデータフレームをマージして新しい列を作成するには、このコードしている。このように文句を言い差分を呼び出すとき
val mydiff = before.join(after, "id")
.withColumn("diff", diff(before, after))
.select("id", "diff")
は、しかし、私はエラーを持っている:
type mismatch; found : org.apache.spark.sql.DataFrame required: org.apache.spark.sql.Column
何を私は理解していない理由は、それがDataFrameを好きではないとそれを解決する方法です...
これらのVARSを行うことができますが、私は返すためにどのように私は理解していない、あなたが示唆されているアプローチ... – user299791
が好きまだUDFのコラム...ヒントはありますか? – user299791
この行 '.withColumn(" diff "、diff(before(" vars ")、after(" vars ")))' diff関数からの結果列名を定義する – iboss