Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.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
Sql 如何根据键值将转换为数组的数据帧添加为另一个数据帧的元素_Sql_Scala_Apache Spark_Apache Spark Sql_Spark Dataframe - Fatal编程技术网

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
数据帧上进行某种分组,因为您有多个相同的键。在这种情况下,不应该有任何重复的问题?或者除了这个运行问题之外还有其他列吗?这只是为了简单起见我发布的一个示例,但是还有一些我没有列出的属性在模式中有重复项。