原理啥的就不多说了,这里一共使用了3种方法对文本内容进行分词,当然,是按照分组的形式分词,如果只是简单的分词,将分组去掉就好。
1 sparksql (1 )采用sql为什么要将这个放在第一位呢,因为在我看来,这个是最容易理解的,仅仅只使用了简单的正则以及sql中的一些函数完成了分词。下面,请看代码:
//获取数据 如果数据在MySQL数据库中的使用相应的获取方式,这里是从hive中获取数据 df=spark.sql(''' select order_id,package_name from spark_catalog.nga.app_all ''') df.show() //构建临时表 df.createOrReplaceTempView('content ') //分词 这里采用了explode这个函数,作用是将一行炸裂成多行 word_counter=spark.sql('''select user_id,word,count(*) as number from content lateral view explode( split( lower( regexp_replace( //这里采用正则的原因是不希望有数字的存在或者是其他的符号 sms_content,"[^a-zA-Z'-]+"," "))," ")) t as word group by user_id,word''')
这段代码的结果有两列。一列是用户信息,一列是单词。虽然结果符合预期,但文本中有大量与网站相关的信息,经过这段代码分开之后,出现的单词就是一堆字母的集合,不是很好。
(2)使用注册函数在spark中,可以将函数带入sql中执行,条件是这个函数必须注册。
//申请临时表 df.createOrReplaceTempView('table_a') //使用的函数,函数功能:将文本分词并返回结果,这里采用了wordninja库 def lower_and_split_1(r): return wordninja.split(r) //注册函数 spark.udf.register('word_a',lower_and_split_1) spark.sql(''' select user_id,word_a(lower(sms_content)) as sms_content from table_a ''').show()
使用库的好处是分出来的英语单词更为精确了,当然,坏处是数字也会加入其中。
2 RDD这里直接使用库即可
def lower_and_split(line): return wordninja.split(line.sms_content.lower()) //由于使用的sqparksql读取的数据,这里采用rdd需要将其转换为rdd的形式 df.rdd.mapValues(lambda s: wordninja.split(s))
同样,也可以采用正则的形式
df.rdd.mapValues(lambda s:re.findall(r"[a-zA-Z]+",s.lower()))3 sparkml
有关spark方面的机器学习的方法,具体可以访问spark官网进行查看。这里给出其相关代码:
from pyspark.ml.feature import RegexTokenizer regexTokenizer = RegexTokenizer(inputCol="sms_content",outputCol="words",pattern="[^a-zA-Z]+") regexTokenized = regexTokenizer.transform(dfmale)
到这里就结束了,这是博主的第一篇文档,如果有相关技术没有写好,欢迎各位大佬指出。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)