想象一下,我们是一份健康计划,我们有一个数据库,记录了提供商向我们收取的每项索赔的所有索赔行详细信息。我想确定使用两个特定程序代码计费的索赔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_id
和code === "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|
+--------+
答案 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|
+--------+