首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对星火数据中的多列执行算术运算

对星火数据中的多列执行算术运算
EN

Stack Overflow用户
提问于 2018-06-29 14:06:44
回答 1查看 2.8K关注 0票数 0

我有一个名为spark-dataframe的输入df

代码语言:javascript
复制
+---------------+---+---+---+-----------+
|Main_CustomerID| P1| P2| P3|Total_Count|
+---------------+---+---+---+-----------+
|         725153|  1|  0|  2|          3|
|         873008|  0|  0|  3|          3|
|         625109|  1|  1|  0|          2|
+---------------+---+---+---+-----------+

这里,Total_CountP1,P2,P3P1,P2,P3product names的总和。我需要通过将产品的值除以它的frequency来找到每个产品的Total_Count。我需要创建一个名为spark-dataframe的新frequencyTable,如下所示,

代码语言:javascript
复制
+---------------+------------------+---+------------------+-----------+
|Main_CustomerID|                P1| P2|                P3|Total_Count|
+---------------+------------------+---+------------------+-----------+
|         725153|0.3333333333333333|0.0|0.6666666666666666|          3|
|         873008|               0.0|0.0|               1.0|          3|
|         625109|               0.5|0.5|               0.0|          2|
+---------------+------------------+---+------------------+-----------+

我是用Scala做的,

代码语言:javascript
复制
val df_columns = df.columns.toSeq
var frequencyTable = df
for (index <- df_columns) {
  if (index != "Main_CustomerID" && index != "Total_Count") {
  frequencyTable = frequencyTable.withColumn(index, df.col(index) / df.col("Total_Count"))
}
}

但是我不喜欢这个for循环,因为我的df比较大。什么是优化的解决方案?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-29 14:22:55

如果你有数据

代码语言:javascript
复制
val df = Seq(
  ("725153", 1, 0, 2, 3),
  ("873008", 0, 0, 3, 3),
  ("625109", 1, 1, 0, 2)
).toDF("Main_CustomerID", "P1", "P2", "P3", "Total_Count")

+---------------+---+---+---+-----------+
|Main_CustomerID|P1 |P2 |P3 |Total_Count|
+---------------+---+---+---+-----------+
|725153         |1  |0  |2  |3          |
|873008         |0  |0  |3  |3          |
|625109         |1  |1  |0  |2          |
+---------------+---+---+---+-----------+

您只需在列上使用foldLeftMain_CustomerIDTotal_Count除外,即P1 P2P3

代码语言:javascript
复制
val df_columns = df.columns.toSet - "Main_CustomerID" - "Total_Count" toList

df_columns.foldLeft(df){(tempdf, colName) => tempdf.withColumn(colName, df.col(colName) / df.col("Total_Count"))}.show(false)

这应该会给你

代码语言:javascript
复制
+---------------+------------------+---+------------------+-----------+
|Main_CustomerID|P1                |P2 |P3                |Total_Count|
+---------------+------------------+---+------------------+-----------+
|725153         |0.3333333333333333|0.0|0.6666666666666666|3          |
|873008         |0.0               |0.0|1.0               |3          |
|625109         |0.5               |0.5|0.0               |2          |
+---------------+------------------+---+------------------+-----------+

我希望答案是有帮助的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51103600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档