【发布时间】:2017-06-18 17:04:49
【问题描述】:
我将下面粘贴在 python 中的现有代码转换为 pyspark。
Python 代码:
import json
import csv
def main():
# create a simple JSON array
with open('paytm_tweets_data_1495614657.json') as str:
tweetsList = []
# change the JSON string into a JSON object
jsonObject = json.load(str)
#print(jsonObject)
# # print the keys and values
for i in range(len(jsonObject)):
tweetsList.insert(i,jsonObject[i]["text"])
#print(tweetsList)
displaySentiment(tweetsList)
def displaySentiment(tweetsList):
aDict = {}
from sentiment import sentiment_score
for i in range(len(tweetsList)):
aDict[tweetsList[i]] = sentiment_score(tweetsList[i])
print (aDict)
with open('PaytmtweetSentiment.csv', 'w') as csv_file:
writer = csv.DictWriter(csv_file, fieldnames = ["Tweets", "Sentiment Value"])
writer.writeheader()
writer = csv.writer(csv_file)
for key, value in aDict.items():
writer.writerow([key, value])
if __name__ == '__main__':
main()
转换后的 Pyspark 代码:
import json
import csv
import os
from pyspark import SparkContext, SparkConf
from pyspark.python.pyspark.shell import spark
os.environ['PYSPARK_PYTHON'] = "/usr/local/bin/python3"
def main():
path = "/Users/i322865/DeepInsights/bitbucket-code/ai-engine/twitter-sentiment-analysis/flipkart_tweets_data_1495601666.json"
peopleDF = spark.read.json(path).rdd
df = peopleDF.map(lambda row: row['text'])
displaySentiment(df.collect())
def displaySentiment(tweetsList):
from sentiment import sentiment_score
aDict = sentiment_score(tweetsList)
#
with open('paytmtweetSentiment.csv', 'w') as csv_file:
writer = csv.DictWriter(csv_file, fieldnames = ["Tweets", "Sentiment Value"])
writer.writeheader()
writer = csv.writer(csv_file)
for i in range(len(tweetsList)):
writer.writerow([tweetsList[i], aDict[i]])
print([tweetsList[i], aDict[i]])
if __name__ == '__main__':
conf = SparkConf().setAppName("Test").setMaster("local")
sc = SparkContext.getOrCreate(conf=conf)
main()
我运行了这两个程序,但没有看到任何显着的性能改进。我错过了什么?请问您能发表一些想法吗?
另外,我也应该使用“减少”吗?我目前只使用“地图”。
【问题讨论】:
-
这种类型的问题不适合该网站,但事实上,这仍然是一个糟糕的代码,说实话,当然没有冒犯! Pyspark 不是一种编程语言。另一方面,Python 是。
-
@eliasah 抱歉,修改了问题。感谢您的快速反馈。
-
调用
df.collect()两次当然性能较差。完全调用它会使 Spark 几乎无用 -
@cricket_007 谢谢。对打印声明感到抱歉。说我是否消除/删除了它(现在检查问题)。请你能告诉我我还缺少什么吗?我也应该使用“减少”吗?我目前只使用“地图”。
-
我不知道您期望发生什么,但是将
df.collect()传递给displaySentiment不会给您带来任何好处。您在这里加速的只是读取 JSON 数据,无论如何,这些数据都受磁盘 IO 的约束。您需要将 dataframe 传递到displaySentiment,而不是 python 列表
标签: python apache-spark pyspark apache-spark-mllib