python - 将嵌套字典转换为 Pyspark 数据框
问题描述
问候程序员同行。
我最近开始使用 pyspark 并且来自熊猫背景。我需要计算数据中用户的相似度。由于我无法从 pyspark 中找到,我求助于使用 python 字典来创建相似性数据框。
但是,我没有将嵌套字典转换为 pyspark Dataframe 的想法。您能否为我提供一个实现这一预期结果的方向。
import pyspark
from pyspark.context import SparkContext
from pyspark.sql import SparkSession
from scipy.spatial import distance
spark = SparkSession.builder.getOrCreate()
from pyspark.sql import *
traindf = spark.createDataFrame([
('u11',[1, 2, 3]),
('u12',[4, 5, 6]),
('u13',[7, 8, 9])
]).toDF("user","rating")
traindf.show()
输出
+----+---------+
|user| rating|
+----+---------+
| u11|[1, 2, 3]|
| u12|[4, 5, 6]|
| u13|[7, 8, 9]|
+----+---------+
它希望在用户之间生成相似性并将其放入 pyspark 数据框中。
parent_dict = {}
for parent_row in traindf.collect():
# print(parent_row['user'],parent_row['rating'])
child_dict = {}
for child_row in traindf.collect():
similarity = distance.cosine(parent_row['rating'],child_row['rating'])
child_dict[child_row['user']] = similarity
parent_dict[parent_row['user']] = child_dict
print(parent_dict)
输出 :
{'u11': {'u11': 0.0, 'u12': 0.0253681538029239, 'u13': 0.0405880544333298},
'u12': {'u11': 0.0253681538029239, 'u12': 0.0, 'u13': 0.001809107314273195},
'u13': {'u11': 0.0405880544333298, 'u12': 0.001809107314273195, 'u13': 0.0}}
从这本字典中,我想构建一个 pyspark 数据框。
+-----+-----+--------------------+
|user1|user2| similarity|
+-----+-----+--------------------+
| u11| u11| 0.0|
| u11| u12| 0.0253681538029239|
| u11| u13| 0.0405880544333298|
| u12| u11| 0.0253681538029239|
| u12| u12| 0.0|
| u12| u13|0.001809107314273195|
| u13| u11| 0.0405880544333298|
| u13| u12|0.001809107314273195|
| u13| u13| 0.0|
+-----+-----+--------------------+
到目前为止,我尝试的是将 dict 转换为 pandas 数据帧并将其转换为 pyspark 数据帧。但是我需要大规模地做到这一点,我正在寻找更多的火花方式来做到这一点。
parent_user = []
child_user = []
child_similarity = []
for parent_row in traindf.collect():
for child_row in traindf.collect():
similarity = distance.cosine(parent_row['rating'],child_row['rating'])
child_user.append(child_row['user'])
child_similarity.append(similarity)
parent_user.append(parent_row['user'])
my_dict = {}
my_dict['user1'] = parent_user
my_dict['user2'] = child_user
my_dict['similarity'] = child_similarity
import pandas as pd
pd.DataFrame(my_dict)
df = spark.createDataFrame(pd.DataFrame(my_dict))
df.show()
输出 :
+-----+-----+--------------------+
|user1|user2| similarity|
+-----+-----+--------------------+
| u11| u11| 0.0|
| u11| u12| 0.0253681538029239|
| u11| u13| 0.0405880544333298|
| u12| u11| 0.0253681538029239|
| u12| u12| 0.0|
| u12| u13|0.001809107314273195|
| u13| u11| 0.0405880544333298|
| u13| u12|0.001809107314273195|
| u13| u13| 0.0|
+-----+-----+--------------------+
解决方案
也许你可以做这样的事情:
import pandas as pd
from pyspark.sql import SQLContext
my_dic = {'u11': {'u11': 0.0, 'u12': 0.0253681538029239, 'u13': 0.0405880544333298},
'u12': {'u11': 0.0253681538029239, 'u12': 0.0, 'u13': 0.001809107314273195},
'u13': {'u11': 0.0405880544333298, 'u12': 0.001809107314273195, 'u13': 0.0}}
df = pd.DataFrame.from_dict(my_dic).unstack().to_frame().reset_index()
df.columns = ['user1', 'user2', 'similarity']
sqlCtx = SQLContext(sc) # sc is spark context
sqlCtx.createDataFrame(df).show()
推荐阅读
- sharepoint - 将 Office 插件部署到 SharePoint 本地环境
- javascript - 自 Firefox 62 以来的空 IFrame
- java - java-stream的map方法中的i++
- python - 从python脚本制作独立可执行文件时如何解决“ImportError:没有名为dis3的模块”
- javascript - ChartJS unique datasets per label
- node.js - Mongoose 使用 schema.post 递增或递减不递减
- azure-functions - Azure 函数停止将消息放入存储队列
- rdp - 黑盒中的鳄梨酱 RDP 远程应用程序
- ubuntu - npm 在 CircleCI 构建中返回“权限被拒绝”
- javascript - 身份验证与 angularfire2 signInWithPopup 和 signInWithRedirect 之间的区别