我是Spark的新手,我绝对需要一些帮助来分类来自Kafka Stream的推文。下面我将解释我到目前为止所做的步骤过程以及我遇到的问题。
我希望你们中的一些人可以帮助我解决这个问题。
提前致谢。
上下文为:
我有一个简单的 Kafka Producer 模拟推文的流(从文件中读取)和 TweetAnalyzer Consumer ,它应该处理和分类推文 Spark Streaming Context ,只要收到它们。
为了对收到的推文进行分类,我之前已经建立并在磁盘上存储 TF-IDF 和 Naive Bayes 模型,这些模型在< em> Spark Streaming Context 开始。
对于每个处理过的推文(词干,标点符号等),我应该计算它的 TF-IDF向量(特征向量),并分别利用先前加载的IDF和朴素贝叶斯模型对其进行分类。 / p>
直截了当地说,当我必须将推文的术语频率向量(TF)转换为 TF-IDF向量时,我的问题就出现了。
这是代码:
Kafka Producer
text_file = list(
csv.reader(
open('/twitterDataset/twitter/test_data.txt', 'rU')
)
)
for row in text_file:
time.sleep(1)
jd = json.dumps(row).encode('ascii')
producer.send(kafka_topic,jd)
TweetAnalyzer
#setting configuration
...
#reading configuration
...
#setting Kafka configuration
...
# Create Spark context
sc = SparkContext(
appName = app_name,
master = spark_master
)
# Create Streaming context
ssc = StreamingContext(
sc,
int(spark_batch_duration)
)
# Loading TF MODEL and compute TF-IDF
....
kafkaParams = {'metadata.broker.list"': kafka_brokers}
# Create direct kafka stream with brokers and topics
kvs = KafkaUtils.createDirectStream(
ssc,
[kafka_topic],
{"metadata.broker.list": kafka_brokers}
)
obj1 = TweetPreProcessing()
lines = kvs.map(lambda x: x[1])
tweet = lines.flatMap(obj1.TweetBuilder)
hashingTF = HashingTF()
#computing TF for each tweet
tf_tweet = tweet.map(lambda tup: hashingTF.transform(tup[0:]))\
.map(lambda x: IDF().fit(x))
.pprint()
ssc.start()
ssc.awaitTermination()
在最后几行代码中,我无法在 x 上应用 IDF()。fit(x)函数,因为Spark需要&#34;术语频率的RDD矢量&#34;而在这一点上,我有一个&#34; Trasformed DStream&#34;由于Streaming Spark Context。
我尝试使用 transform()或 foreachRDD()函数代替 map(),但我不知道如何在转换后正确返回新的DStream。
例如:
tf_tweet = tweet.map(lambda tup: hashingTF.transform(tup[0:]))\
.transform(classify_tweet)
.pprint()
def classify_tweet(tf):
#compute TF-IDF of the tweet
idf = IDF().fit(tf)
tf_idf = idf.transform(tf)
#print(tf_idf.collect())
return idf
如果我使用transform函数运行代码,Spark会触发(在后面跟踪的顶部)这个错误:
文件 &#34; /workspace_spark/spark-1.6.2-bin-hadoop2.6/python/lib/pyspark.zip/pyspark/streaming/util.py" ;,第67行,在通话中返回r._jrdd > AttributeError:&#39; IDFModel&#39;宾语 没有属性&#39; _jrdd&#39;
但如果我省略return语句并只打印 tf_idf vector ,它会给我正确的输出,如下所示:
[SparseVector(1048576,{164998:0.0,364601:0.0,924192:0.0,963449: 0.0})] [SparseVector(1048576,{251465:0.0,821055:0.0,963449:0.0})] [SparseVector(1048576,{234762:0.0,280973:0.0,403903:0.0, 712732:0.0,861562:0.0,1040690:0.0})] ......
如果我做对了,我认为问题是当我需要 DStream 时,我 SparseVector
无论如何,这个问题有解决方案吗?
如果有人可以帮我解决这个问题,我会非常感激,我不幸遇难。
谢谢
答案 0 :(得分:0)
返回已转换的tf_idf
:
>>> def classify_tweet(tf):
... return IDF().fit(tf).transform(tf)