如何为存在的每一行向 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 数据框中添加新列?的主要内容,如果未能解决你的问题,请参考以下文章