spark处理超大文件方法 spark读取hdfs文件规则( 三 )


宽表
列数太多的表就是宽表 。比如我见过的最宽的表是1W列的 ,  尤其在机器学习系统中 ,  由于要抽取高维特征 ,  所以在ETL阶段经常会把很多的表拼接成一个很大的宽表 。这种宽表是数据可视化的天敌 , 比如我们的功能是可以随机预览一份数据的100行 。那100*1W这样的数据量要传输到前端并渲染就是个很费事的操作了 。尤其是预览本身也是要执行一些计算的 。如果加上这份数据本来就有海量分片的话 ,  要在后台打开这么多的文件 , 再加上读取这么宽的表的数据 。甚至有可能OOM ,  实际上我也确实见过因为这个原因OOM的 。所以这个测试点就是我们故意去造这样的宽表进行测试 。
其他的数据类型不一一解释了 ,  都跟字面的意思差不多 。
造数
之所以也使用spark这种分布式框架来造数 , 而不是单独使用parquet或者hdfs的client是因为我们造的数据除了要符合一些极端场景外 , 也要保证要有足够的数据量 ,  毕竟ETL都是面对大数据场景的 。所以利用spark的分布式计算的优势可以在短时间内创建大量数据 。比如我前两天造过一个1亿行 , 60个G的数据 , 只用了20分钟 。
技术细节
RDD是spark的分布式数据结构 。一份数据被spark读取后会就生成一个RDD , 当然RDD就包含了那些partition 。我们创建RDD的方式有两种 ,  一种是从一个已有的文件中读取RDD , 当然这不是我们想要的效果 。所以我们使用第二种 ,  从内存中的一个List中生成RDD 。如下:
public class Demo {
public static void main(String[] args) {
SparkConf conf = new SparkConf().setAppName(“data produce”)
.setMaster(“local”);
JavaSparkContext sc = new JavaSparkContext(conf);
SparkSession spark = SparkSession
.builder()
.appName(“Java Spark SQL basic example”)
.getOrCreate();
List data = https://www.520longzhigu.com/shenghuo/new XRange(1000);
JavaRDD distData = https://www.520longzhigu.com/shenghuo/sc.parallelize(data, 100);
上面是我写的一个demo , 前面初始化spark conf和spark session的代码可以先忽略不用管 。主要看最后两行 ,  XRange是我仿照python的xrange设计的类 。可以帮我用类似生成器的原理创建一个带有index序列的List 。其实这里我们手动创建一个list也行 。而最后一行就是我们通过spark的API把一个List转换成一个RDD 。sc.parallelize的第一个参数是List , 而第二个参数就是你要设置的并行度 ,  也可以理解为你要生成这个数据的partition的数量 。其实如果我们现在想生成这一千行的只有index的数据的话 ,  再调用这样一个API就可以了:distData.saveAsTextFile(“path”); 通过这样一个API就可以直接保存文件了 。当然这样肯定不是我们想要的 , 因为里面还没有我们要的数据 。所以这个时候我们要出动spark的一个高级接口 , dataframe 。dataframe是spark仿照pandas的dataframe的设计开发的高级API 。功能跟pandas很像 ,  我们可以把一个dataframe就当做一个表来看 ,  而它也有很多好用的API 。最重要的是我们有一个DataframeWriter类专门用来将dataframe保存成各种各样格式和分区的数据的 。比如可以很方便的保存为scv , txt这种传统数据 ,  可以很方便保存成parquet和orc这种列式存储的文件格式 。也提供partition by的操作来保存成分区表或者是分桶表 。总之它能够帮我们造出各种我们需要的数据 。那么我们如何把一个RDD转换成我们需要的dataframe并填充进我们需要的数据呢 。往下看:


以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!

「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助: