当值包含来自单独字段的其他值时保留字段值

时间:2017-11-17 20:28:21

标签: scala apache-spark

想象一下,我们是一份健康计划,我们有一个数据库,记录了提供商向我们收取的每项索赔的所有索赔行详细信息。我想确定使用两个特定程序代码计费的索赔ID。这是一个虚拟数据集:

val df = Seq(
        ("153T32", "D0201"), 
        ("153T32", "D3303"), 
        ("153T32", "F2303"),
        ("421F32", "D0200"),
        ("421F32", "D1111"),
        ("421F32", "D0201"),
        ("991E32", "D0201"),
        ("991E32", "F2303"),
        ("991E32", "A1123"),
        ("529E52", "G1029"),
        ("529E52", "B0392")).
    toDF("claim_id", "code")

在这个假设示例中,我想确定与claim_idcode === "D0201"相关联的code === "F2303"值。我想出了如何创建两个新的DataFrame,其中每个都在code值之一上进行过滤,然后将它们连接在一起。但如果有一种方法可以在不创建中间数据框架的情况下执行此操作,那么我想看看你们都会如何做到这一点。

这是我目前的解决方案:

val df1 = df.where($"code" === "D0201")
val df2 = df.where($"code" === "F2303")
val joinExpr = df1.col("claim_id") === df2.col("claim_id")

val finalDF = df1.join(df2, joinExpr, "inner").select(df1.col("claim_id"))

finalDF.show()
+--------+
|claim_id|
+--------+
|  153T32|
|  991E32|
+--------+

1 个答案:

答案 0 :(得分:1)

假设原始数据框中没有重复的行,这里有一种方法没有加入:

(df.where($"code".isin("D0201", "F2303"))
   .groupBy("claim_id").agg(count($"code").as("cnt"))
   .where($"cnt" === 2).select("claim_id")
).show
+--------+                                                                      
|claim_id|
+--------+
|  153T32|
|  991E32|
+--------+