2017-05-30 40 views
0

我剛開始學習scala來做數據分析,並且當我嘗試基於另一個數據框標記我的數據行時遇到問題。根據另一個數據框標記數據行的行的斯卡拉代碼

假設我有與被設置爲"F"在年初df1所有行列"date","id","value","label"一個df1。然後我有這個df2這是一個較小的數據集合,其列"date","id","value"。然後我想要將df1中的行標籤從"F"更改爲"T",如果該行出現在df2中,則df2中的某一行具有相同的("date","id","value")組合排在df1

我試着用df.filterdf.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

基本的想法是加入兩個,然後計算結果。類似這樣的:

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連接。對於不在df2中的所有內容,「tmp」將爲空,因此我們可以使用它來計算標籤。

相關問題