Spark的RDD编程模拟RPAD函数效果实现数据右侧填充空格等内容以便文件对齐Java

Posted 虎鲸不是鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark的RDD编程模拟RPAD函数效果实现数据右侧填充空格等内容以便文件对齐Java相关的知识,希望对你有一定的参考价值。

Spark的RDD编程模拟RPAD函数效果实现数据右侧填充空格等内容以便文件对齐【Java】

背景

之前以RPAD函数为例:https://lizhiyong.blog.csdn.net/article/details/127501392

查看了Hive中RPAD函数的实现及随系统自动加载为系统函数。笔者本文同样以RPAD函数的功能为参照,展示RDD编程的魅力。

为了适配之前已经存在的各种系统,在完成了定长双文件解析入湖到Hive表后,还需要有反向操作,也就是Hive2FTP定长双文件,将Hive表的数据通过元数据文件及数据文件的方式导出到FTP。在进行文件处理的操作时,由于Hive表的元数据已经做好了解析,故定长双文件的元数据文件中大部分内容其实并不需要从DataFrame中获取,DataFrame和RDD在使用时也就不会有什么特别明显的区别。当然为了实现更好的性能和更高的自由度,笔者不可能像肤浅的SQL Boy们那样使用Spark SQL这种方式简单套用RPAD函数。

DEMO

话不多说,直接上代码:

        JavaRDD<Row> rowJavaRDD = FullDF.toJavaRDD();//获取RDD
        int num_Clm = Integer.parseInt(String.valueOf(FullDF.schema().length()));//获取到DF的Column个数
        String[] cells = new String[num_Clm];//开辟数组空间
        int[] num_diff = new int[num_Clm];//需补" "的个数
        String[] rowContent = "鹅鹅鹅";//随便写一个,用于存储行信息
	    StringBuilder strb = new StringBuilder();//构建StringBuilder实例对象,用于后续的字符串拼接
        JavaRDD<String> JavaRDD_Map = rowJavaRDD.map((Function<Row, String>) row -> //操作RDD算子
            for (int i = 0; i < num_Clm; i++) //遍历列
                strb.delete(0, strb.length());//清除数据
                cells[i] = String.valueOf(row.get(i));//获取数据
                strb.append(cells[i]);//+头
                num_diff[i] = Integer.parseInt(spLen[i]) - cells[i].getBytes().length;//需要追加的" "个数
                for (int j = 0; j < num_diff[i]; j++) //遍历+空格
                    strb.append(" ");//追加空格" "补齐,当然实际生产级不一定只能补空格
                
                cells[i] = strb.toString();//校正长度完成
                strb.delete(0, strb.length());//释放内存
            

            for (int i = 0; i < num_Clm; i++) //获取行
                strb.append(cells[i]);//追加
            

            rowContent[0] = strb.toString();//获取到行内容
            strb.delete(0, strb.length());//释放内存
            return rowContent[0];
        );

        JavaRDD<String> mapCache = JavaRDD_Map.cache();//缓存
        JavaRDD<String> cache = mapCache.repartition(1).cache();//dat只能1个大文件

当然使用DataFrame编程也无妨,依旧可以使用Map算子【需要指定Encoder】。使用Map算子跑批较foreach遍历当然是性能更好,较foreachpartition算子,在保障数据文件每一行数据的顺序这种大问题上也更有信心。。。实测性能还不错,3000w条数据大概7个G体量时10min内完成数据导出、压缩gz、上传FTP。3e体量时不到40分钟,集群还是相当给力。

尾言

笔者大费周章用RDD编程的方式模拟RPAD函数,除了获取更好的性能外,还有个目的,就是借助Java较SQL来说更为强悍的灵活性,解决编码问题。这是个生产问题,生产级源码不可能公之于众。有需要的读者可以用get Bytes的方式对每一条数据做处理。

转载请注明出处:https://lizhiyong.blog.csdn.net/article/details/127680782

以上是关于Spark的RDD编程模拟RPAD函数效果实现数据右侧填充空格等内容以便文件对齐Java的主要内容,如果未能解决你的问题,请参考以下文章

Spark编程模型(核心篇 一)

spark 常用函数介绍(python)

Spark基础编程学习01

大数据技术之_19_Spark学习_02_Spark Core 应用解析+ RDD 概念 + RDD 编程 + 键值对 RDD + 数据读取与保存主要方式 + RDD 编程进阶 + Spark Cor

Spark之RDD编程

Spark之RDD编程