我有一个带有用户列表的DF:
+-------+---+
| user| Id|
+-------+---+
| Peter| 1|
| Max| 2|
| Steve| 3|
| Chris| 4|
并让另一个DF知道哪个页面访问了哪个用户:
+-----------+-------+
| page| user|
+-----------+-------+
| Page1| Peter|
| Page1| Max|
| Page2| Max|
| Page3| Steve|
| Page3| Chris|
| Page4| Chris|
我通过用户字段进行了“内部”加入:
+-----------+-------+---+
| page| user| Id|
+-----------+-------+---+
| Page1| Peter| 1|
| Page1| Max| 2|
| Page2| Max| 2|
| Page3| Steve| 3|
| Page3| Chris| 4|
| Page4| Chris| 4|
现在要创建此DF的稀疏矢量,如下所示:
+-------+----------------------------------------------------+
| page| features|
+-------+----------------------------------------------------+
| Page1|SparseVector({Peter: 1.0, Max: 1.0, Steve: 0.0,...})|
| Page2|SparseVector({Peter: 0.0, Max: 1.0, Steve: 0.0,...})|
| Page3|SparseVector({Peter: 0.0, Max: 0.0, Steve: 1.0,...})|
| Page4|SparseVector({Peter: 0.0, Max: 0.0, Steve: 0.0,...})|
如果有该页面的用户,将在此处设置为“ 1.0”,如果该页面没有用户,则将设置为“ 0.0”
from pyspark.sql.functions import col
from pyspark.sql import SparkSession
from pyspark.ml.feature import MinHashLSH
from pyspark.ml.linalg import Vectors
from pyspark.sql import Row
from pyspark.ml.feature import VectorAssembler
from pyspark import SparkContext
sc = SparkContext("local", "Simple App")
df = sc.parallelize([Row(PAGE="Page1", USER="Peter", USER_ID=1),
Row(PAGE="Page1", USER="Max", USER_ID=2),
Row(PAGE="Page2", USER="Max", USER_ID=2),
Row(PAGE="Page3", USER="Steve", USER_ID=3),
Row(PAGE="Page3", USER="Chris", USER_ID=4),
Row(PAGE="Page4", USER="Chris", USER_ID=4)]).toDF()
dfpivot=(df.groupBy("PAGE").pivot("USER").count().na.fill(0))
dfpivot.show()
input_cols = [x for x in dfpivot.columns if x != "PAGE"]
dfassembler1 = (VectorAssembler(inputCols=input_cols, outputCol="features").transform(dfpivot)
.select("PAGE", "features"))
dfassembler1.show()
mh = MinHashLSH(inputCol="features", outputCol="hashes", numHashTables=3)
model = mh.fit(dfassembler1)
model.transform(dfassembler1).show(3, False)
但是我遇到了一些例外:无法解析列名...并在调用“转换”时出错
可能是我做错了。感谢您的帮助
答案 0 :(得分:1)
答案在错误消息中。只需在配置中将spark.sql.pivotMaxValues
设置为期望的不同值的数量即可。
set('spark.sql.pivotMaxValues', '999999')
答案 1 :(得分:0)
这是对我有用的代码
spark.conf.set("spark.sql.pivotMaxValues", 9000000)