对spark进行字符统计 和java进行一些对比和思考

文章比较了Spark和Java进行字符统计的方法,强调了Spark的API封装如何简化逻辑,接近SQL操作,而Java则更注重基础逻辑实现,如循环和Map操作。讨论了在处理复杂逻辑时,两者的优势和局限性,指出Spark的RDD抽象和链式编程在简化表达上的作用,以及Java在嵌入条件判断方面的灵活性。
摘要由CSDN通过智能技术生成

对spark进行字符统计 和java进行一些对比和思考

以下是表达

1.spark

def main(args: Array[String]): Unit = {

        //1.创建SparkConf并设置App名称
        val conf = new SparkConf().setAppName("WC").setMaster("local[*]")

        //2.创建SparkContext,该对象是提交Spark App的入口
        val sc = new SparkContext(conf)

        //3.读取指定位置文件:hello atguigu atguigu
        val lineRdd: RDD[String] = sc.textFile("input")

        //4.读取的一行一行的数据分解成一个一个的单词(扁平化)(hello)(atguigu)(atguigu)
        val wordRdd: RDD[String] = lineRdd.flatMap(line => line.split(" "))

        
        //切分好完全的词语结构==》列成map结构
        //5. 将数据转换结构:(hello,1)(atguigu,1)(atguigu,1)
        val wordToOneRdd: RDD[(String, Int)] = wordRdd.map(word => (word, 1))

        //根据map结构的key进行聚合(map ,被加后的数值总和)
        //6.将转换结构后的数据进行聚合处理 atguigu:1、1 =》1+1  (atguigu,2)
        val wordToSumRdd: RDD[(String, Int)] = wordToOneRdd.reduceByKey((v1, v2) => v1 + v2)

        //7.将统计结果采集到控制台打印
        val wordToCountArray: Array[(String, Int)] = wordToSumRdd.collect()
        wordToCountArray.foreach(println)

        //一行搞定
        //sc.textFile(args(0)).flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _).saveAsTextFile(args(1))

        //8.关闭连接
        sc.stop()

2.java

public class MapTest {
    public static void main(String[] args) {

        String s = "ababababcbc";

        Map<Character, Integer> map = new HashMap<>();
        //Map<Character, Integer> map = new HashMap<>();

        int count = 0;
        for (int i = 0; i < s.length() ; i ++ ){

            char c = s.charAt(i);
            //System.out.println(c); //存字符串中 逐个获取char
            map.getOrDefault(c,0) ; //map 如果没有就加默认为0
            count++;
            map.put(c,count); //map结构 统计和设定值
        }

        System.out.println(map);

    }
}
 


1.表达的简易性区别

spark更像是屏蔽了底层(基本逻辑) 而使用高度封装api的形式
而这些高度封装的api 让人着重于逻辑的实现 【比如sql】  
不用描写循环计数累加 map格式类型的表达
而不在乎其底层的实现表达

相对比而言  spark的高度封装 使其靠近了sql的逻辑 
比如对map形式的变化 (k v)
语言的表达 是靠近基本底层的逻辑的
对于java而言 如果要完成类map的运算 需要进行map类型的存储
如代码可以见 java进行的运算都其基本形式和逻辑 map类型 以及for循环的计数相加
而spark提供的api可以直接变化其rdd的个数 以及聚合算子。
~其实底层都是一样的。都需要一个 类似map的表达 计数相加。


2.过度封装对逻辑表达的优缺点
封装的rdd 使得其表达足够简易,同时使用了链式编程和lamada表达式
这只是一种表达方式而已。同理java中也有对表达简化的表达形式.
rdd更像是高度抽象的统计算子。

如果在循环统计中加入大量的逻辑 比如 如果是 a的权值为2  b的权值为3
ab同时出现的权值为4
就需要加入更多的逻辑表达式,而简单的表达形式 其实无法简化复杂的逻辑处理
比如遇到[a,2],[b,3],[ab,4],[ba,4];

rdd的高度抽象map是统一操作 [anything,1]
java由于循环的存在 可以嵌入if表达 对map进行选择赋值
同时也可以嵌入ab 是否相连的表达 因为使用的是基本的语言逻辑处理结构

sql层面做的化  需要嵌入 when then的结构


字段 key a a a a b b ab ba

select `key`,count(*) from (
SELECT 
char_list.`key`,
case
when char_list.`key` = 'a' then 2
when char_list.`key` = 'b' then 3
when char_list.`key` like 'ab' then 4
when char_list.`key` like 'ba' then 4
Else 0 END as value_key
FROM sql_practice.char_list
) rank
GROUP BY value_key

a   3
b   2
ab  2


也是基本的统计也还好了 就是简单的统计逻辑
我觉得sql的表达也是为了统计处理表结构 也就是横向统计


如果出现了 如果第一次出现 那么第二次逻辑的变动
其实会增加sql的复杂度
emmm 假如需要1000次if 或者数据的复杂关联等等
患者多个疾病健康之间的关联

此篇文章这个之后还会再更一下  感觉说的不是很完善

描述一下之后遇到的场景  以及sql处理的局限性
更多的底层表达 对于复杂关系的表达其实是有好处的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值