Scala 检查其他数据帧中是否存在特定标识符
说明: 我有两个数据帧Scala 检查其他数据帧中是否存在特定标识符,scala,apache-spark,dataframe,apache-spark-sql,Scala,Apache Spark,Dataframe,Apache Spark Sql,说明: 我有两个数据帧df1和df2df1有一个id列表的id列 我需要检查df2数据帧中是否存在任何一个ID 条件 如果id出现在df2id列中,并且如果代码是状态,则从df2获取特定id的名称,并使用名称列创建一个新的数据框 预期产出 val df1 = Seq(("[1,10,20]", "bat","43243"),("[20,4,10]","mouse","4324432"),("[30,20,3]", "horse","4324234")).toDF("id", "word","us
df1
和df2
df1
有一个id列表的id
列
我需要检查df2
数据帧中是否存在任何一个ID
条件
如果id
出现在df2
id
列中,并且如果代码是状态
,则从df2获取特定id
的名称
,并使用名称
列创建一个新的数据框
预期产出
val df1 = Seq(("[1,10,20]", "bat","43243"),("[20,4,10]","mouse","4324432"),("[30,20,3]", "horse","4324234")).toDF("id", "word","userid")
val df2 = Seq((1, "raj", "name"),(2, "kiran","name"),(3,"karnataka","state"),(4, "Andrapradesh","state")).toDF("id", "name", "code")
通过将
id
列转换为数组并应用explode
,可以首先展平该列。然后,您可以在数据帧之间应用正常的连接操作
例如:
val-df1=Seq((“[1,10,20],“bat”,“43243”),(“[20,4,10],“mouse”,“4324432”),(“[30,20,3],“horse”,“4324234”)。toDF(“id”,“word”,“userid”)
val df2=序号((1,“拉吉”,“姓名”),(2,“基兰”,“姓名”),(3,“卡纳塔克邦”,“州”),(4,“安德拉普拉德什”,“州”)。toDF(“id”,“姓名”,“代码”)
val flattedf1=df1。
挑选(
col(“id”),
expr(““split”(regexp\u replace(id),“\[\\\]”,“,”,“,”)”).as(“idArray”),col(“word”),
col(“userid”))。
带列(“id”),爆炸(列(“idArray”))。
下降(“艾达瑞”)
df2.as(“df2”)。
加入(
df1.作为(“df1”),
col(“df2.id”)==col(“df1.id”)。
过滤器(“代码=‘状态’”。
选择(“df1.id”、“word”、“userid”、“name”)。
显示
//结果:
// +---------+-----+-------+------------+
//| id | word | userid | name|
// +---------+-----+-------+------------+
//|[30,20,3]|马| 4324234 |卡纳塔克邦|
//|[20,4,10]|鼠标| 4324432 |和Rapradesh|
// +---------+-----+-------+------------+
我希望它能有所帮助。您可以在连接中使用UDF作为条件:
id | word | userid | name
-------------------------+-----------------------
[30,20,3] | "horse" | "4324234" | "karnataka"
[20,4,10] | "mouse" | "4324432" | "Andrapradesh"
这个解决方案可能有效,可能比我的更优雅。但是,不确定他是否有数组或表示数组的字符串。在后一种情况下,如果我没有弄错的话,字符串必须先转换成数组。使用UDF是正确的选择吗?不使用正则表达式是不可能的吗expr(““split”(regexp\u replace(id)”,“,”,“,”)”)。as(“idArray”)、col(“word”),“``如果列
id
是一个带方括号的实际字符串,我想您必须应用一些字符串操作才能将列表中的实际值放入数组中。然后,您可以将数据帧展平,或者像您的另一个答案一样应用UDF。使用正则表达式是一个问题吗?如果是,请解释为什么要看看我们有什么替代方案。
val arrayJoin = udf {
(a: WrappedArray[Int], v: Int) => a.contains(v)
}
val result = df1
.join(df2.as("df2"), arrayJoin(df2("id"), df1("id"))) //join using udf
.drop("df2.id", "df2.code") //drop unnecessary columns