2017-05-30 1 views
0

データ分析を行うためのスカラの学習が始まったばかりで、別のデータフレームに基づいてデータ行にラベルを付けると問題が発生しました。別のデータフレームに基づいてデータフレームの行にラベルを付けるためのスカラコード

は、私が最初にdf1内のすべての行に対して"F"なるように設定されている列"date","id","value","label"df1があるとします。次に、"date","id","value"という列の小さなデータセットであるdf2があります.DFTの行ラベルを"F"から"T"に変更したい場合は、その行がdf2に表示されている場合、df2の偶数行には("date","id","value")df1の行。

私はとdf.joinで試しましたが、どちらも問題を解決できないようです。

+1

これまでに何をしていますか? –

+0

あなたはどのデータフレームを使用していますか?スパーク? –

+0

はい私はスパークを使用しています!答えのおかげで、両方が役に立ちます! – Selena

答えて

0

私はこれがあなたが探しているものだと思います。

val spark =SparkSession.builder().master("local").appName("test").getOrCreate() 

import spark.implicits._ 
     //create Dataframe 1 
    val df1 = spark.sparkContext.parallelize(Seq(
     ("2016-01-01", 1, "abcd", "F"), 
     ("2016-01-01", 2, "efg", "F"), 
     ("2016-01-01", 3, "hij", "F"), 
     ("2016-01-01", 4, "klm", "F") 
    )).toDF("date","id","value", "label") 

    //Create Dataframe 2 
    val df2 = spark.sparkContext.parallelize(Seq(
    ("2016-01-01", 1, "abcd"), 
    ("2016-01-01", 3, "hij") 
)).toDF("date1","id1","value1") 

    val condition = $"date" === $"date1" && $"id" === $"id1" && $"value" === $"value1" 

    //Join two dataframe with above condition 
    val result = df1.join(df2, condition, "left") 

// check wather both fields contain same value and drop columns 
    val finalResult = result.withColumn("label", condition) 
    .drop("date1","id1","value1") 
//Update column label from true false to T or F 
    finalResult.withColumn("label", when(col("label") === true, "T").otherwise("F")).show 
0

基本的な考え方は、2つを結合して結果を計算することです。このような何か:

df2Mod = df2.withColumn("tmp", lit(true)) 
joined = df1.join(df2Mod , df1("date") <=> df2Mod ("date") && df1("id") <=> df2Mod("id") && df1("value") <=> df2Mod("value"), "left_outer") 
joined.withColumn("label", when(joined("tmp").isNull, "F").otherwise("T") 

アイデアは、私たちは「TMP」の列を追加し、参加left_outerを行うということです。 "tmp"はdf2にないすべてのものに対してnullになるので、それを使ってラベルを計算することができます。

関連する問題