Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Spark Streaming-推特分类';卡夫卡之流_Apache Spark_Pyspark_Spark Streaming_Apache Spark Mllib_Sentiment Analysis - Fatal编程技术网

Apache spark Spark Streaming-推特分类';卡夫卡之流

Apache spark Spark Streaming-推特分类';卡夫卡之流,apache-spark,pyspark,spark-streaming,apache-spark-mllib,sentiment-analysis,Apache Spark,Pyspark,Spark Streaming,Apache Spark Mllib,Sentiment Analysis,我是Spark的新手,我绝对需要一些帮助来对卡夫卡流中的推特进行分类。接下来,我将解释到目前为止我所做的步骤过程以及我遇到的困难 我希望你们中的一些人能帮我解决这个问题 提前谢谢。 上下文如下所示: 我有一个简单的卡夫卡制作人,它模拟推特流(从文件中读取),还有一个推特分析器消费者,一旦收到推特,就应该在火花流上下文中对推特进行处理和分类 为了对收到的tweet进行分类,我在前面构建了TF-IDF和Naive Bayes模型,并将其存储在磁盘上,这些模型在Spark Streaming上下文启

我是Spark的新手,我绝对需要一些帮助来对卡夫卡流中的推特进行分类。接下来,我将解释到目前为止我所做的步骤过程以及我遇到的困难

我希望你们中的一些人能帮我解决这个问题

提前谢谢。

上下文如下所示:

我有一个简单的卡夫卡制作人,它模拟推特流(从文件中读取),还有一个推特分析器消费者,一旦收到推特,就应该在火花流上下文中对推特进行处理和分类

为了对收到的tweet进行分类,我在前面构建了TF-IDF和Naive Bayes模型,并将其存储在磁盘上,这些模型在Spark Streaming上下文启动之前加载

对于处理的每条tweet(词干、标点等),我应该计算其TF-IDF向量(特征向量),并分别利用先前加载的IDF和naivebayes模型对其进行分类

直截了当地说,当我必须将tweet的术语频率向量(TF)转换为TF-IDF向量时,我的问题就出现了

代码如下:

卡夫卡制作人

text\u文件=列表(
csv.reader(
打开('/twitterDataset/twitter/test_data.txt','rU')
)
)
对于文本文件中的行:
时间。睡眠(1)
jd=json.dumps(行).encode('ascii')
制作人发送(卡夫卡主题,jd)
TweetAnalyzer

#设置配置
...  
#读取配置
...
#设置卡夫卡配置
...
#创建火花上下文
sc=SparkContext(
appName=应用程序名称,
母版=火花母版
)
#创建流上下文
ssc=StreamingContext(
资深大律师,
int(火花批处理持续时间)
)
#加载TF模型并计算TF-IDF
....
kafkaParams={'metadata.broker.list':kafka_brokers}
#创建带有代理和主题的直接卡夫卡流
kvs=KafkaUtils.createDirectStream(
ssc,
[卡夫卡主题],
{“metadata.broker.list”:kafka_brokers}
)
obj1=预处理()
lines=kvs.map(λx:x[1])
tweet=lines.flatMap(obj1.TweetBuilder)
hashingTF=hashingTF()
#计算每条tweet的TF
tf_tweet=tweet.map(lambda tup:hashingTF.transform(tup[0:]))\
.map(lambda x:IDF().fit(x))
.pprint()
ssc.start()
ssc.终止协议()
在最后几行代码中,我无法在x上应用IDF().fit(x)函数,因为Spark需要“术语频率向量的RDD”,而在这一点上,由于流式Spark上下文,我有一个“传输格式的数据流”

我尝试使用transform()或foreachRDD()函数代替map(),但我不知道如何在转换后正确返回新的数据流

例如:

tf_tweet=tweet.map(lambda tup:hashingTF.transform(tup[0:]))\
.transform(分类_tweet)
.pprint()
def分类_推特(tf):
#计算推特的TF-IDF
idf=idf().fit(tf)
tf_idf=idf.transform(tf)
#打印(tf_idf.collect())
返回idf
如果我使用transform函数运行代码,Spark(在回溯的顶部)会触发以下错误:

文件 “/workspace_spark/spark-1.6.2-bin-hadoop2.6/python/lib/pyspark.zip/pyspark/streaming/util.py”,第67行,调用返回r._jrdd
AttributeError:'IDFModel'对象 没有属性“\u jrdd”

但是如果我省略return语句,只打印tf_idf向量,它会给出正确的输出,如下所示:

[SparseVector(1048576,{164998:0.0364601:0.0924192:0.0963449: [SparseVector(1048576,{251465:0.0821055:0.0963449:0.0})]
[SparseVector(1048576,{234762:0.0280973:0.040903:0.0712732:0.0861562:0.01040690:0.0}]

如果我做对了,我想问题是当SparseVector需要数据流时,我不能返回它

不管怎样,这个问题有解决办法吗

如果有人能帮我解决这个问题,我会非常感激的,我不幸地陷入困境


谢谢

返回
tf_idf

>>> def classify_tweet(tf):
...     return IDF().fit(tf).transform(tf)

返回转换后的
tf_idf

>>> def classify_tweet(tf):
...     return IDF().fit(tf).transform(tf)