Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 检查其他数据帧中是否存在特定标识符_Scala_Apache Spark_Dataframe_Apache Spark Sql - Fatal编程技术网

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