【发布时间】:2019-11-20 15:04:21
【问题描述】:
问题
请帮助找到从 DataFrame 中的(用户、特征、值)记录创建分布式矩阵的方法,其中特征及其值存储在一列中。
数据摘录如下,但有大量用户和功能,并没有为用户测试所有功能。因此,很多特征值都是空的,要归结为 0。
例如,血液测试可能具有糖水平、胆固醇水平等作为特征。如果这些级别不可接受,则将 1 设置为值。但并非所有功能都会针对用户(或患者)进行测试。
+----+-------+-----+
|user|feature|value|
+----+-------+-----+
| 14| 0| 1|
| 14| 222| 1|
| 14| 200| 1|
| 22| 0| 1|
| 22| 32| 1|
| 22| 147| 1|
| 22| 279| 1|
| 22| 330| 1|
| 22| 363| 1|
| 22| 162| 1|
| 22| 811| 1|
| 22| 290| 1|
| 22| 335| 1|
| 22| 681| 1|
| 22| 786| 1|
| 22| 789| 1|
| 22| 842| 1|
| 22| 856| 1|
| 22| 881| 1|
+----+-------+-----+
如果特征已经是列,那么有办法解释。
- Spark - How to create a sparse matrix from item ratings
- Calculate Cosine Similarity Spark Dataframe
- How to convert a DataFrame to a Vector.dense in scala
但事实并非如此。因此,一种方法可能是旋转数据框以应用这些方法。
+----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|user| 0| 32|147|162|200|222|279|290|330|335|363|681|786|789|811|842|856|881|
+----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| 14| 1| 0| 0| 0| 1| 1| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0|
| 22| 1| 1| 1| 1| 0| 0| 1| 1| 1| 1| 1| 1| 1| 1| 1| 1| 1| 1|
+----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
然后使用行到向量的转换。我想使用其中之一:
- 向量汇编器
- org.apache.spark.mllib.linalg.Vectors.fromML
- org.apache.spark.mllib.linalg.distributed.MatrixEntry
但是,由于将有许多空值归为 0,因此旋转后的数据帧将消耗更多的内存空间。旋转分布在多个节点之间的大型数据帧也会导致大洗牌。
因此,寻求意见、想法、建议。
相关
- Spark - How to create a sparse matrix from item ratings
- Calculate Cosine Similarity Spark Dataframe
- How to convert a DataFrame to a Vector.dense in scala
- VectorAssembler
- Scalable Sparse Matrix Multiplication in Apache Spark
- Spark MLlib Data Types | Apache Spark Machine Learning
- Linear Algebra and Distributed Machine Learning in Scala using Breeze and MLlib
环境
火花 2.4.4
【问题讨论】:
-
有趣的问题。但目前尚不清楚 - 为什么需要这个?而且-您是否仅限于火花?看起来您可以将所有数据保存在 HBase 或任何其他列式存储中。
-
如here所示使用pivot怎么样?
标签: scala apache-spark sparse-matrix apache-spark-mllib