• 【待补充】[Spark Core] Spark 实现标签生成



    0. 说明

      在 IDEA 中编写 Spark 代码实现将 JSON 数据转换成标签,分别用 Scala & Java 两种代码实现。


    1. 准备

      1.1 pom.xml 

        <dependencies>
            <dependency>
                <groupId>org.apache.spark</groupId>
                <artifactId>spark-core_2.11</artifactId>
                <version>2.1.0</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.47</version>
            </dependency>
        </dependencies>

      1.2 工具类 TagUtil

    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONArray;
    import com.alibaba.fastjson.JSONObject;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 从 json 中抽取评论集合
     */
    public class TagUtil {
        public static List<String> extractTag(String json) {
    
            List<String> list = new ArrayList<String>();
    
            // 将字符串解析成 json 对象
            JSONObject obj = JSON.parseObject(json);
            JSONArray arr = obj.getJSONArray("extInfoList");
            if (arr != null && arr.size() > 0) {
                // 得到数组的第一个 json 对象
                JSONObject firstObj = arr.getJSONObject(0);
                JSONArray values = firstObj.getJSONArray("values");
                if (values != null && values.size() > 0) {
                    for (int i = 0; i < values.size(); i++) {
                        String tag = values.getString(i);
                        list.add(tag);
                    }
                }
            }
            return list;
        }
    }

    2. 标签生成代码编写

      2.1 Scala 版

    import java.util
    import com.share.util.TagUtil
    import org.apache.spark.rdd.RDD
    import org.apache.spark.{SparkConf, SparkContext}
    
    /**
      * 标签生成
      */
    object TaggenScala1 {
      def main(args: Array[String]): Unit = {
        // 创建 spark 配置对象
        val conf = new SparkConf()
        conf.setAppName("TaggenApp")
        conf.setMaster("local")
    
        // 创建上下文
        val sc = new SparkContext(conf)
    
        // 1. 加载文件
        val rdd1 = sc.textFile("file:///e:/temptags.txt")
    
        // 2. 解析每行的json数据成为集合
        val rdd2: RDD[(String, java.util.List[String])] = rdd1.map(line => {
          val arr: Array[String] = line.split("	")
          // 商家id
          val busid: String = arr(0)
          // json
          val json: String = arr(1)
          val list: java.util.List[String] = TagUtil.extractTag(json)
          Tuple2[String, java.util.List[String]](busid, list)
        })
    
        // 3. 过滤空集合 (85766086,[干净卫生, 服务热情, 价格实惠, 味道赞])
        val rdd3: RDD[(String, util.List[String])] = rdd2.filter((t: Tuple2[String, java.util.List[String]]) => {
          !t._2.isEmpty
        })
    
        // 4. 将值压扁  (78477325,味道赞)
        val rdd4: RDD[(String, String)] = rdd3.flatMapValues((list: java.util.List[String]) => {
          // 导入隐式转换
          import scala.collection.JavaConversions._
          list
        })
    
        // 5. 滤除数字的tag  (78477325,菜品不错)
        val rdd5 = rdd4.filter((t: Tuple2[String, String]) => {
          try {
            Integer.parseInt(t._2)
            false
          } catch {
            case _ => true
          }
        })
    
        // 6. 标1成对  ((70611801,环境优雅),1)
        val rdd6: RDD[Tuple2[Tuple2[String, String], Int]] = rdd5.map((t: Tuple2[String, String]) => {
          Tuple2[Tuple2[String, String], Int](t, 1)
        })
    
        // 7. 聚合  ((78477325,味道赞),8)
        val rdd7: RDD[Tuple2[Tuple2[String, String], Int]] = rdd6.reduceByKey((a: Int, b: Int) => {
          a + b
        })
    
        // 8. 重组 (83073343,List((性价比高,8)))
        val rdd8: RDD[Tuple2[String, List[Tuple2[String, Int]]]] = rdd7.map((t: Tuple2[Tuple2[String, String], Int]) => {
          Tuple2[String, List[Tuple2[String, Int]]](t._1._1, Tuple2[String, Int](t._1._2, t._2) :: Nil)
        })
    
        // 9. reduceByKey  (71039150,List((环境优雅,1), (价格实惠,1), (朋友聚会,1), (团建,1), (体验好,1)))
        val rdd9: RDD[Tuple2[String, List[Tuple2[String, Int]]]] = rdd8.reduceByKey((a: List[Tuple2[String, Int]], b: List[Tuple2[String, Int]]) => {
          a ::: b
        })
    
        // 10. 分组内排序  (88496862,List((回头客,5), (服务热情,4), (味道赞,4), (分量足,3), (性价比高,2)))
        val rdd10: RDD[Tuple2[String, List[Tuple2[String, Int]]]] = rdd9.mapValues((list: List[Tuple2[String, Int]]) => {
          val list2: List[Tuple2[String, Int]] = list.sortBy((t: Tuple2[String, Int]) => {
            -t._2
          })
          list2.take(5)
        })
    
        // 11. 商家间排序 (75144086,List((服务热情,38), (效果赞,30), (无办卡,22), (环境优雅,22), (性价比高,21)))
        val rdd11: RDD[Tuple2[String, List[Tuple2[String, Int]]]] = rdd10.sortBy((t: Tuple2[String, List[Tuple2[String, Int]]]) => {
          t._2(0)._2
        }, false)
    
        rdd11.collect().foreach(println)
      }
    }

      2.2 Java 版

    待补充。。。


    且将新火试新茶,诗酒趁年华。
  • 相关阅读:
    asp.net mvc 中使用async/await异步编程
    简述C#中浅复制和深复制
    Angular:自定义表单控件
    Angular:Reactive Form的使用方法和自定义验证器
    Angular:ViewProviders和Providers的区别
    Angular:OnPush变化检测策略介绍
    Angular:利用内容投射向组件输入ngForOf模板
    在Angular中利用trackBy来提升性能
    Angular @HostBinding()和@HostListener()用法
    Angular利用@ViewChild在父组件执行子组件的方法
  • 原文地址:https://www.cnblogs.com/share23/p/9766448.html
Copyright © 2020-2023  润新知