对于 Scala 中的同一记录,比较一个数据框中多列中的值与一列中多行的值,以获取目标数据框中的值?

Compare the values in multiple columns in one Dataframe with multiple rows in one single column for target dataframe for the same record in Scala?

我的源和目标是这样的

源数据帧

key     col1    col2    col3    col4    col5    col6
1       AA      BB      CC      null    null    null
2       SS      null    null    null    null    null
3       AA      CC      RR      SS      DD      null

目标数据帧

Key     Column
1       AA
1       BB
1       CC
2       SS
3       AA
....

我想比较这两个值以检查它们是否正确填充并且没有重复。 我尝试了几种方法,但都很慢,

我试过的一种方法是:

  1. 读取列表中的“键”列,
  2. 然后遍历源并获取数组中该键的所有列值,
  3. 从数组中删除空值,然后对数组进行排序。
  4. From target 类似的操作将所有值存储在数组中作为键然后对数组进行排序并将数组与:
 sourceArray.sameElements(targetArray) 

有什么简单的解决办法吗?我想我把这个简单的问题复杂化了。

您可以从除 key 以外的所有列创建数组,过滤数组中的空值然后分解它:

val df1 = df.withColumn(
  "Column", 
  array(df.columns.filter(_!="key").map(col(_)):_*)
).select(
  col("key"),
  explode(expr("filter(Column, x -> x is not null)")).as("Column")
)

df1.show
//+---+------+
//|key|Column|
//+---+------+
//|  1|    AA|
//|  1|    BB|
//|  1|    CC|
//|  2|    SS|
//|  3|    AA|
//|  3|    CC|
//|  3|    RR|
//|  3|    SS|
//|  3|    DD|
//+---+------+

或者简单地使用 stack 表达式对列进行逆透视然后过滤掉空值:

val df1 = df.selectExpr(
  "key",
  "stack(6, col1, col2, col3, col4, col5, col6) as Column"
).filter("Column is not null")