從數據庫裏讀取記錄
我們要創建一個DataFrame來存儲從數據庫裏讀取的表。
首先要創建Spark的入口–SparkSession對象。
需要引入的包:
import org.apache.spark.sql.SparkSession
在main函數裏:
val spark = SparkSession.builder().getOrCreate()//創建一個SparkSession對象
然後使用spark.read.format(“jdbc”)通過從mysql數據庫讀取的數據(讀取的是某個表,DataFrame也是一個類似於數據庫表的結構的數據結構):
val jdbcDF = spark.read.format("jdbc")
.option("url","jdbc:mysql://picpic.55555.io:24691/recTest")
.option("driver","com.mysql.jdbc.Driver")
.option("dbtable","isbn_info")
.option("user","rec")
.option("password","cuclabcxg")
.load()
可以查看一下該表的模式:
jdbcDF.printSchema()
Jieba進行中文分詞
IDEA中首先在Maven pom.xml中添加jieba所需依賴:
<dependency>
<groupId>com.huaban</groupId>
<artifactId>jieba-analysis</artifactId>
<version>1.0.2</version>
</dependency>
在程序裏導入jieba包:
import com.huaban.analysis.jieba.JiebaSegmenter
import com.huaban.analysis.jieba.JiebaSegmenter.SegMode
在main裏,取出mysql表中數據,轉成String格式,然後再使用jieba分詞。
val comment:String = jdbcDF.first()(6).toString()
var jieba:String = new JiebaSegmenter().sentenceProcess(comment).toString()
上面代代碼就是取出comment字段爲String格式,然後使用jieba的sentenceProcess方法進行分詞。
全部代碼及結果
import org.apache.spark.sql.SparkSession
import com.huaban.analysis.jieba.JiebaSegmenter
import com.huaban.analysis.jieba.JiebaSegmenter.SegMode
object wordCut {
def main(args: Array[String]): Unit = {
//spark的入口
val spark = SparkSession.builder().getOrCreate()//創建一個SparkSession對象
//訪問數據庫,得到dataframe存儲表數據
val jdbcDF = spark.read.format("jdbc")
.option("url","jdbc:mysql://picpic.55555.io:24691/recTest")
.option("driver","com.mysql.jdbc.Driver")
.option("dbtable","isbn_info")
.option("user","rec")
.option("password","cuclabcxg")
.load()
//取出評論
val comment:String = jdbcDF.first()(6).toString()
var jieba:String = new JiebaSegmenter().sentenceProcess(comment).toString()
print(jieba)
}
}
Jieba分詞函數的探究
JiebaSegmenter對象下有兩個方法:process(),sentenceProcess()。
從IDEA上給出的函數參數可以看出,process()需要兩個參數(要進行分詞的String類型的文本(段落),切分模式mode(INDEX或SEARCH));sentenceProcess()只需要一個參數(要進行分詞的String類型的文本(句子))。
我上面使用的是sentenceProcess,結果是對的。那麼使用前者輸出結果會是什麼樣的呢?有什麼作用呢?下面就來測試一下:
val str:String = "我來到北京清華大學。"
var jieba0:String = new JiebaSegmenter().sentenceProcess(str).toString()
println(jieba0)
var jieba2:String = new JiebaSegmenter().process(str,SegMode.INDEX).toString()
println(jieba2)
var jieba3 = new JiebaSegmenter().process(str,SegMode.SEARCH).toString()
println(jieba3)
在此可以發現:使用process()結果是列表套列表,裏面的每個小列表中元素依次是
[分好的詞, 分好的詞的第一個字符在文本字符數組的索引, 分好的詞的最後一個字符在文本字符數組的索引的下一個索引]
INDEX:精準的切開,用於對用戶查詢詞分詞;
SEARCH:長詞再切分,提高召回率。
(對這兩個模式的解釋翻遍全網,這個還算靠譜)
分詞的執行邏輯
可以看到核心在於:
1、內部包含一個字典
2、分詞邏輯
3、不同模式的切分粒度