我一直在尝试将一个数据帧的结果作为一个新的数组字段添加到另一个基于键值的数据帧中。
例如,我有一个数据帧,我们称之为df1
:
root
|-- DF_KEY: integer (nullable = false)
|-- DF_DESC: string (nullable = false)
+------------+--------------------+
|DF_KEY | DF_DESC |
+------------+--------------------+
| 10000|String Desc A |
| 10000|String Desc B |
和另一个数据帧df2
:
root
|-- DF_KEY: integer (nullable = false)
|-- COL_A: decimal(20,0) (nullable = true)
|-- COL_B: decimal(20,0) (nullable = true)
|-- COL_C: string (nullable = false)
我想将这两个数据帧与df1
的结果组合为一个新的数组ARRAY_OF_DF_DESC
,该数组将产生具有以下模式的数据帧(newDF
)。
root
|-- DF_KEY: integer (nullable = false)
|-- COL_A: decimal(20,0) (nullable = true)
|-- COL_B: decimal(20,0) (nullable = true)
|-- COL_C: string (nullable = false)
|-- ARRAY_OF_DF_DESC : array (nullable = false)
| |-- element: string (containsNull = false)
我试着加入:
val otherRefsArray = df1.select($"DF_KEY", array(df1.columns.map(col): _*) as "ARRAY_OF_DF_DESC ")
val newDF = df2.join(otherRefsArray, "DF_KEY")
但是该联接仅为newDf
数据帧中的每一个df1
行添加了一个单独的WrappedArray
。并且它为每个DF_DESC
返回重复的记录。
如果可能的话,我想传递一个包含与该行的DF_KEY
相关联的所有DF_DESC
的WrappedArray
。有人知道如何使用scala吗?
您可以使用groupBy()
并为每个键收集一个列表。
val otherRefsArray = df1.groupBy($"DF_KEY")
.agg(collect_list($"DF_DESC").as("ARRAY_OF_DF_DESC"))
之后,以与之前相同的方式使用join
。