【发布时间】:2019-03-18 17:44:13
【问题描述】:
这是在 Spark 2.1 中,给定这个输入文件:
`order.json
{"id":1,"price":202.30,"userid":1}
{"id":2,"price":343.99,"userid":1}
{"id":3,"price":399.99,"userid":2}
以及以下数据框:
val order = sqlContext.read.json("order.json")
val df2 = order.select(struct("*") as 'order)
val df3 = df2.groupBy("order.userId").agg( collect_list( $"order").as("array"))
df3有以下内容:
+------+---------------------------+
|userId|array |
+------+---------------------------+
|1 |[[1,202.3,1], [2,343.99,1]]|
|2 |[[3,399.99,2]] |
+------+---------------------------+
和结构:
root
|-- userId: long (nullable = true)
|-- array: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- id: long (nullable = true)
| | |-- price: double (nullable = true)
| | |-- userid: long (nullable = true)
现在假设我得到了 df3:
我想为每个 userId 计算 array.price 的总和,利用每个 userId 行的数组。
我会将此计算添加到结果数据框中的新列中。就像我已经完成了 df3.withColumn("sum", lit(0)),但是 lit(0) 被我的计算取代了。
它会假设是直截了当的,但我坚持两者。我没有找到任何方法来访问整个数组进行每行的计算(例如使用 foldLeft)。
【问题讨论】:
标签: arrays scala apache-spark apache-spark-sql