Scala 如何将包含3列的关系数据集转换为二维稀疏矩阵?
我将spark 2.0.0与scala 2.11结合使用 我有一个数据框,它有3列:Scala 如何将包含3列的关系数据集转换为二维稀疏矩阵?,scala,apache-spark,Scala,Apache Spark,我将spark 2.0.0与scala 2.11结合使用 我有一个数据框,它有3列: object_id category_id count 1 653 5 1 78 1 1 28 6 2 63 2 3 59 7 如何将其转换为这种格式 1 653:5 78:1 28:6 2 63:2 3 5
object_id category_id count
1 653 5
1 78 1
1 28 6
2 63 2
3 59 7
如何将其转换为这种格式
1 653:5 78:1 28:6
2 63:2
3 59:7
使用RDD干杯
yourDS.rdd
.map(row => (row.getInt(0), row.getInt(1), row.getInt(2)))
.groupBy({ (oid, cid, c) => iod })
.map({
(oid, iter) => (oid, iter.foldLeft("")((acc, tup) => acc + " " + tup._2 + ":" + tup._3))
})
.toDF("id", "hash")
留在数据集世界会有点困难,因为您必须合并列。我的方法使用
DataFrame
s而不是RDD
s,因此它与其他答案不同
import org.apache.spark.sql.functions._
import org.apache.spark.sql.types.StringType
import scala.collection.mutable.WrappedArray
val a = sc.parallelize(Array(
(1, 653, 5),
(1, 78, 1),
(1, 28, 6),
(2, 63, 2),
(3, 59, 7)
)).toDF("object_id", "category_id", "count")
val x = a.select(col("object_id"), concat(col("category_id"), lit(":") , col("count")).as("res"))
def concat_things(a: WrappedArray[String]) = a.reduce(_ + " " + _)
val conUDF = udf(concat_things _, StringType)
x.groupBy("object_id").agg(collect_list(col("res")).as("res")).select(col("object_id"), conUDF(col("res"))).show()
//+---------+---------------+
//|object_id| UDF(res)|
//+---------+---------------+
//| 1|653:5 78:1 28:6|
//| 3| 59:7|
//| 2| 63:2|
//+---------+---------------+
你可以在上面检查这个答案。不想让这个家伙没有答案-结果是
透视
功能在一个groupBy
后完全符合我的要求
数据集
.groupBy(“对象id”)
.pivot(“类别id”,所有类别id列表)
您尝试了什么?:)@eliasah看起来像个-为什么要努力?写关于stackoverflow的问题。让别人来解决我的问题。yourDS.rdd.map(row=>(row.getInt(0),row.getInt(1),row.getInt(2)).groupBy({(oid,cid,c)=>iod}.map({(oid,iter)=>(oid,iter.foldLeft(“”)(acc,tup=>acc+tup.\u2+“:“+tup.\u3))
@SarveshKumarSingh我把我的答案贴在下面了。这个问题来自我刚接触Spark的时候:)