Sql 如何根据键值将转换为数组的数据帧添加为另一个数据帧的元素
我一直在尝试根据键值将一个数据帧的结果作为新的数组字段添加到另一个数据帧中 例如,我有一个数据帧,我们称之为Sql 如何根据键值将转换为数组的数据帧添加为另一个数据帧的元素,sql,scala,apache-spark,apache-spark-sql,spark-dataframe,Sql,Scala,Apache Spark,Apache Spark Sql,Spark Dataframe,我一直在尝试根据键值将一个数据帧的结果作为新的数组字段添加到另一个数据帧中 例如,我有一个数据帧,我们称之为df1: root |-- DF_KEY: integer (nullable = false) |-- DF_DESC: string (nullable = false) +------------+--------------------+ |DF_KEY | DF_DESC | +------------+------------
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\u 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")
但是这个连接只为df1
行的newDf
数据帧添加了一个WrappedArray
。并为每个DF_DESC
返回重复记录
如果可能,我希望传递一个WrappedArray
,其中包含与该行DF_键相关联的所有DF_DESC
。有人知道如何使用scala实现这一点吗?您可以使用groupBy()
收集每个键的列表
val otherRefsArray = df1.groupBy($"DF_KEY")
.agg(collect_list($"DF_DESC").as("ARRAY_OF_DF_DESC"))
然后,以与之前相同的方式使用join
。这是唯一的选项吗?我问这个问题是因为我在groupBy中遇到了一些问题,因为模式中存在一些重复项。如果没有其他选项,我将处理重复项并尝试groupBy。@RonniePhelps我认为groupBy()
和collect\u list
是最简单的解决方案,我认为您无法避免在df1
数据帧上进行某种分组,因为您有多个相同的键。在这种情况下,不应该有任何重复的问题?或者除了这个运行问题之外还有其他列吗?这只是为了简单起见我发布的一个示例,但是还有一些我没有列出的属性在模式中有重复项。