如何为存在的每一行向 Spark 数据框中添加新列?

Posted

技术标签:

【中文标题】如何为存在的每一行向 Spark 数据框中添加新列?【英文标题】:How do I add a new column to a Spark dataframe for every row that exists? 【发布时间】:2019-03-13 10:20:01 【问题描述】:

我正在尝试使用 Spark 数据框创建一个比较矩阵,并首先创建一个每个值一行的单列数据框:

val df = List(1, 2, 3, 4, 5).toDF

从这里开始,我需要为每一行创建一个新列,并(现在)在每个空间中插入一个随机数,如下所示:

  Item   1   2   3   4   5  
 ------ --- --- --- --- --- 
     1   0   7   3   6   2  
     2   1   0   4   3   1  
     3   8   6   0   4   4  
     4   8   8   1   0   9  
     5   9   5   3   6   0  

任何帮助将不胜感激!

【问题讨论】:

使用withColumn("newcolumnname", logic) @Giri 感谢您的回复 - 如果我遍历行,每次添加一列,它会返回一个 Unit 对象,我无法将其转换为数据框。 Item列分组后应该考虑使用.pivot()函数 @pheeleeppoo 你有例子吗? 如果DataFrame 足够大,可以首先使用 Spark,由于多种原因(规划器开销、本地内存使用),所需的输出将不可行。如果您真的只使用少数项目@pheeleeppoo 答案将起作用,否则您应该重新考虑设计。 【参考方案1】:

考虑使用.pivot() 函数转置名为df 的输入DataFrame,如下所示:

val output = df.groupBy("item").pivot("item").agg((rand()*100).cast(DataTypes.IntegerType))

这将生成一个新的 DataFrame,其中包含与行值相对应的随机整数值(否则为null)。

+----+----+----+----+----+----+
|item|1   |2   |3   |4   |5   |
+----+----+----+----+----+----+
|1   |9   |null|null|null|null|
|3   |null|null|2   |null|null|
|5   |null|null|null|null|6   |
|4   |null|null|null|26  |null|
|2   |null|33  |null|null|null|
+----+----+----+----+----+----+

如果您不想要 null 值,您可以考虑稍后应用 UDF。

【讨论】:

谢谢你 - 最后一个问题,在你发布的示例中(以及当我做同样的事情时),行是按顺序排列的 1 3 5 4 2。有什么方法可以对这些进行数字排序? 只需在agg 函数后添加.sort("item")。如果对您有帮助,请采纳答案。

以上是关于如何为存在的每一行向 Spark 数据框中添加新列?的主要内容,如果未能解决你的问题,请参考以下文章

向数据框中的新列添加值

R中向具有大量数据集的数据框添加新列的有效方法

如何为 DataTable 中的每一行设置/获取自定义数据

如何为数据表的每一行添加按钮?

Spark Scala - 如何为每个组创建新列,然后在 spark 数据框中分解列值

在火花数据框中使用 for 循环添加新列