2017-05-30 37 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”将为空,因此我们可以使用它来计算标签。

相关问题