让我们说给出交易输入:
df = spark.createDataFrame([ (0,"a"),(1,"b"),"c"),(2,(0,"cc"),(3,(4,(5,"c")],["ID","category"])
+---+--------+| ID|category|+---+--------+| 0| a|| 1| a|| 1| b|| 1| c|| 2| a|| 2| b|| 2| b|| 2| b|| 2| c|| 0| a|| 1| b|| 1| b|| 2| cc|| 3| a|| 4| a|| 5| c|+---+--------+
总结格式:
df.groupBy(df["ID"],df["category"]).count().show()
+---+--------+-----+| ID|category|count|+---+--------+-----+| 1| b| 3|| 1| a| 1|| 1| c| 1|| 2| cc| 1|| 2| c| 1|| 2| a| 1|| 1| a| 1|| 0| a| 2|+---+--------+-----+
我的目标是通过ID得到这个输出:
+---+-----------------------------------------------+| ID| feature |+---+-----------------------------------------------+| 2|SparseVector({a: 1.0,b: 3.0,c: 1.0,cc: 1.0})|
你能指点我正确的方向吗?使用Java中的mapreduce对我来说似乎更容易.
解决方法 使用pivot和VectorAssembler可以非常轻松地完成此 *** 作.用pivot替换聚合:piVoted = df.groupBy("ID").pivot("category").count().na.fill(0)
和组装:
from pyspark.ml.feature import VectorAssemblerinput_cols = [x for x in piVoted.columns if x != ID]result = (VectorAssembler(inputCols=input_cols,outputCol="features") .transform(piVoted) .select("ID","features"))
结果如下.这将根据稀疏性选择更有效的表示:
+---+---------------------+|ID |features |+---+---------------------+|0 |(5,[1],[2.0]) ||5 |(5,[0,3],[5.0,1.0]) ||1 |[1.0,1.0,3.0,0.0]||3 |(5,1],[3.0,1.0]) ||2 |[2.0,1.0]||4 |(5,[4.0,1.0]) |+---+---------------------+
但当然你仍然可以将它转换为单一的表示形式:
from pyspark.ml.linalg import SparseVector,VectorUDTimport numpy as npdef to_sparse(c): def to_sparse_(v): if isinstance(v,SparseVector): return v vs = v.toArray() nonzero = np.nonzero(vs)[0] return SparseVector(v.size,nonzero,vs[nonzero]) return udf(to_sparse_,VectorUDT())(c)
+---+-------------------------------------+|ID |features |+---+-------------------------------------+|0 |(5,[2.0]) ||5 |(5,1.0]) ||1 |(5,1,2,[1.0,1.0]) ||3 |(5,1.0]) ||2 |(5,3,4],[2.0,1.0])||4 |(5,1.0]) |+---+-------------------------------------+总结
以上是内存溢出为你收集整理的python – 稀疏矢量pyspark全部内容,希望文章能够帮你解决python – 稀疏矢量pyspark所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)