A.コードの実装
1つの パッケージbig.data.analyse.tokenizer 2 3 インポートcom.hankcs.hanlp.HanLP 4 インポートcom.hankcs.hanlp.tokenizer.StandardTokenizer 5 インポートorg.apache.log4j。{レベル、ロガー} 6 インポートorg.apache.spark .SQL。{SQLContext、行} 7 インポートorg.apache.spark.sql.catalyst.expressions.StringToMap 8 インポートorg.apache.spark.sql.types。{IntegerType、StringType、StructType、StructField} 9 インポートorg.apache。スパーク。{SparkContext、SparkConf} 10 11 / ** 12 使用Hanlp分词器中*スパーク 13 * 2019年5月30日にジェンによって作成されます。 14 * / 15 オブジェクトHanlpTokenizer { 16 / ** 17 *设置日志级别 18 * / 19 Logger.getLogger( "ORG" ).setLevel(Level.WARN) 20 DEFメイン(引数:配列[文字列]){ 21 ヴァル・CONF = 新しいSparkConf() 22 .setAppName( "HanlpTokenizer" ) 23 .setMaster( "ローカル[2]" ) 24 25 ヴァルのSC = 新しいSparkContext(CONF) 26 27 ヴァルsqlContext = 新しいsQLContext(SC) 28 ヴァル配列:配列[文字列] =配列(「火花点火バージョン2.4リリース、大きなパフォーマンスの向上、スパークエコシステムはますます向上」、 29 「火花sparkML機械学習は、スパーク停止のための生態系スパークの重要な部分であります強力な活力「へと発展し、 30 スパークの急速な発展とともに、Hadoopのは、特に、機械学習や計算の面で、スピードを提供することができ、あまり大きなギャップ」 - 「機械学習、 31 」solr-検索エンジンや古いです無傷で、継続的な開発solrcloudで、データの量には特に大きくない状況、まだ「多くの自然の利点があり、 32は SolrのSolrの-ES」は技術の最も深刻な影響である」) 33 34 ヴァルtermRdd = sc.parallelize(アレイ).MAP(行=> { // 標準ワード、マウントHanlpトークナイザ 35 VAR結果= "" 36 ヴァルtype_content = row.split( " - " ) 37 [ ヴァルtermList = StandardTokenizer.segment(type_content(1 )) 38 のための式(I < - 0 までtermList.size()){ 39 ヴァル用語= termList.get(I) 40 // 場合(term.nature.name.contains! ( "W")&&!term.nature.name()。( "U")は&& term.nature.name()。( "M")を含んでいる){含ま 41 なら 1(term.word.length> ){ 42 結果+ = term.word + "" 43 } 44 // } 45 } 46 行(type_content(0 )、 結果) 47 }) 48 49 ヴァルstructType =StructType(アレイ( 50 StructField( "arth_type"、StringType、真)、 51 StructField( "コンテンツ"、StringType、真) 52 )) 53 54 ヴァルtermDF = sqlContext.createDataFrame(termRdd、structType) 55 56 / ** 57 *列转行 58 * / 59 ヴァルtermCheckDF = termDF.rdd.flatMap(行=> { 60 ヴァルarth_type = row.getAs [文字列]( "arth_type" ) 61 ヴァル含量= row.getAs [文字列]( "コンテンツ" ) 62 VaRのRES =配列[行]() 63 ヴァルcontent_array = content.split(」 " ) 64 のための(CON < - content_array){ 65 のRES =のRES:+行(arth_type、CON、1 ) 66 } 67 RES 68 。})(コレクト) 69 70 / ** 71 *重新转成DF 72 * / 73 ヴァルstructType2 = StructType(アレイ( 74 StructField( "arth_type"、StringType、真)、 75 StructField( "コンテンツ"、StringType、真)、 76 StructField( "NUM"、IntegerType、真) 77 )) 78 79 ヴァルtermListDF = sqlContext.createDataFrame(sc.parallelize(termCheckDF)、structType2) 80 81 / ** 82 *注册临时视图 83 * / 84 termListDF.createOrReplaceTempView( "termListDF" ) 85 86 / ** 87 *分组求和 88 * / 89 ヴァル結果= sqlContext.sql( "arth_typeを選択し、コンテンツ、和(NUM)NUM" + 90 "termListDF群からnum個のDESCによってarth_type、コンテンツORDER BY" ) 91 92 result.count() 93 result.show(5) 94 95 sc.stop() 96 } 97 }
II。結果