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

时间:2017-10-18 06:17:03

标签: sql scala apache-spark apache-spark-sql spark-dataframe

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

例如,我有这个数据框,我们称之为"images": [ { "src": "http://demo.woothemes.com/woocommerce/wp-content/uploads/sites/56/2013/06/T_2_front.jpg", "position": 0 }, { "src": "http://demo.woothemes.com/woocommerce/wp-content/uploads/sites/56/2013/06/T_2_back.jpg", "position": 1 }

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") 行向WrappedArray数据框添加了一个df1。并返回每个newDf的重复记录。

如果可能,我希望传递一个DF_DESC,其中包含与该行WrappedArray相关联的所有DF_DESC。有没有人知道如何用scala做到这一点?

1 个答案:

答案 0 :(得分:1)

您可以使用var array = [1, 2, 3, 4, 5] array.removeFirst(2) print(array) // [3, 4, 5] 并为每个密钥收集一个列表。

groupBy()

然后,以与以前相同的方式使用val otherRefsArray = df1.groupBy($"DF_KEY") .agg(collect_list($"DF_DESC").as("ARRAY_OF_DF_DESC"))