如何将转换为数组的数据帧添加为基于键值的另一个数据帧的元素



我一直在尝试将一个数据帧的结果作为一个新的数组字段添加到另一个基于键值的数据帧中。

例如,我有一个数据帧,我们称之为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_DESCWrappedArray。有人知道如何使用scala吗?

您可以使用groupBy()并为每个键收集一个列表。

val otherRefsArray = df1.groupBy($"DF_KEY")
.agg(collect_list($"DF_DESC").as("ARRAY_OF_DF_DESC"))

之后,以与之前相同的方式使用join

相关内容

  • 没有找到相关文章

最新更新