01.导入相关的库,生成SparkSession对象:
#导入相关的库
from os import truncate
from pyspark import sql
from pyspark.ml.feature import FeatureHasher, HashingTF,IDF,Tokenizer
from pyspark import SparkContext,SparkConf
from pyspark.sql import SparkSession
from pyspark.sql.types import *
spark = SparkSession.builder.config(conf=SparkConf()).getOrCreate()
02.连接mysql数据库,使用数据库中的表:
(*已经隐藏IP和密码)
#连接mysql数据库
jdbcDF = spark.read.format("jdbc")\
.option("driver","com.mysql.jdbc.Driver")\
.option("url","jdbc:mysql://***.***.**.***:3306/Gadaite")\
.option("dbtable","RedditNews")\
.option("user","root")\
.option("password","*******")\
.load()
jdbcDF.show()
jdbc.show()结果如下(默认只显示20行):
03.注册为临时表,实现SQL语句的查询和对数据的选取,表名:datasource
data = jdbcDF.createOrReplaceTempView("datasource")
04.选取前50行数据进行实验:
dataX = spark.sql("select News from datasource limit 50")
dataX.show()
data.show()只是上图的前50行,但是字段只选取了`News`
05.导入序号生成的包,并生成序号:
(其中通过每行的文字代替一个文本文件,实现)
from pyspark.sql.functions import monotonically_increasing_id
#创建一个dataframe,每一个句子代表一个文档
sentenceData = dataX.withColumn("id",monotonically_increasing_id())
sentenceData.show()
sentenceData.show()结果如下:
06.在得到文档集合后,即可用tokenizer对句子进行分词
tokenizer = Tokenizer(inputCol="News", outputCol="words")
wordsData = tokenizer.transform(sentenceData)
wordsData.show()
wordsData.show()结果如下:
07.使用HashingTF的transform()方法把句子哈希成特征向量,这里设置哈希表的桶数为200。
分词序列被变换成一个稀疏特征向量,其中每个单词都被散列成了一个不同的索引值,
特征向量在某一维度上的值即该词汇在文档中出现的次数。
hashingTF = HashingTF(inputCol="words", outputCol="rawFeatures", numFeatures=200)
featurizedData = hashingTF.transform(wordsData)
featurizedData.select("words","rawFeatures").show(truncate=False)
结果如下:
(部分画面简直太美,不忍直视,给个数据量小一点如下,但不是本文数据,本文是上面那个)
类似的样子:
08.使用IDF来对单纯的词频特征向量进行修正
idf = IDF(inputCol="rawFeatures", outputCol="features")
idfModel = idf.fit(featurizedData)
09.IDFModel是一个Transformer,调用它的transform()方法,即可得到每一个单词对应的TF-IDF度量值
rescaledData = idfModel.transform(featurizedData)
rescaledData.select("label", "features").show()
最终结果如下(200为哈希桶的数量,后面的数字,代表在那个桶里面):
10.结束:
spark.stop()
后续,可以将结果dataframe保存为CSV等本地文件,也可以使用RDD模式匹配等方法在写入数据库的某个表中。