Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.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 - Fatal编程技术网

Scala:如何将数据框中一列的数据与另一列的数据进行匹配

Scala:如何将数据框中一列的数据与另一列的数据进行匹配,scala,apache-spark,Scala,Apache Spark,我有以下数据,希望将数据从df1的ID列匹配到df2 df1: Df2: 代码: 我得到的输出如下: ID key 1 777 1 765 2 708 3 4 5 然而,我期望如下,这里的逻辑是来自df1的,我们有id列值1,在df2中,值1匹配了不止一次,因此我得到了上面的输出。但我不应该匹配第二个事件,因为它匹配第一个事件 预期产出: ID key 1 777 2 708 3 4 5 我不应该匹配第二个事件,因为它匹

我有以下数据,希望将数据从df1的ID列匹配到df2

df1:

Df2:

代码:

我得到的输出如下:

ID    key
1     777
1     765
2     708     
3
4
5
然而,我期望如下,这里的逻辑是来自df1的,我们有id列值1,在df2中,值1匹配了不止一次,因此我得到了上面的输出。但我不应该匹配第二个事件,因为它匹配第一个事件

预期产出:

ID    key
1     777
2     708     
3
4
5
我不应该匹配第二个事件,因为它匹配第一个事件

我建议您为df2创建一个递增的id,以便在加入df1时识别匹配顺序,以便以后可以轻松地仅在第一个匹配中进行筛选。为此,您可以受益于
单调地增加\u id()

然后将数据帧分为匹配数据帧和非匹配数据帧

之后,在
匹配df
上,为每个窗口上的每一行生成行号,按ID分组,并按上面提到的递增ID进行排序。然后在第一个匹配行中进行筛选。然后合并到不匹配的数据框中,删除新创建的列,并用空字符填充所有空字符

你应该满足你的要求

+---+---+
|ID |key|
+---+---+
|1  |777|
|2  |708|
|3  |   |
|4  |   |
|5  |   |
+---+---+ 
ID    key
1     777
1     765
2     708     
3
4
5
ID    key
1     777
2     708     
3
4
5
import org.apache.spark.sql.functions._
val finalDF = Df1.join(DF2.withColumnRenamed("key", "key2").withColumn("order", monotonically_increasing_id()), $"ID" === $"first" || $"ID" === $"second" || $"ID" === $"third","left").select($"ID", $"key2".as("key").cast(StringType), $"order")
val notMatchingDF = finalDF.filter($"key".isNull || $"key" === "")
val matchingDF = finalDF.except(notMatchingDF)
import org.apache.spark.sql.expressions._
def windowSpec = Window.partitionBy("ID").orderBy("order")

matchingDF.withColumn("order", row_number().over(windowSpec))
  .filter($"order" === 1)
  .union(notMatchingDF)
  .drop("order")
  .na.fill("")
+---+---+
|ID |key|
+---+---+
|1  |777|
|2  |708|
|3  |   |
|4  |   |
|5  |   |
+---+---+