Spark Streaming - 推文的分类'来自卡夫卡的流

时间:2016-07-24 17:42:14

标签: apache-spark pyspark spark-streaming apache-spark-mllib sentiment-analysis

我是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

无论如何,这个问题有解决方案吗?

如果有人可以帮我解决这个问题,我会非常感激,我不幸遇难。

谢谢

1 个答案:

答案 0 :(得分:0)

返回已转换的tf_idf

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