spark 读取ftp_Spark读取双层ZIP压缩包

问题

项目中碰到一个新问题,需要利用Spark分析海量小文件,具体大概是这样的:

海量的双层压缩包:

数量可能几十万或更多,文件大小从几KB到几MB不等,可能是zip+zip压缩,也可能是zip+gz压缩。分析发现,外层的ZIP包中可能含有多个文件,内层的zip或gz包中只会有一个csv文件。

实际表头格式也有多种,但处理方法和具体业务结合的较多,本问不再赘述。

不同压缩方式的文件混在一起,无法在获取的时候自动分拣。

非主流的Spark使用方法:

由于存在一些现实因素,再加上担心hadoop对海量小文件支持的不好,因此实验环境是一个单机多进程(多个worker)的spark环境,文件存储在本地,而非HDFS,诸如newapihadoopfile等高大上的接口并没进行分析测试,但貌似整个apache生态圈都不太支持zip。

对于rdd和Dataframe的困惑:

过去提到Spark,接下来肯定是讨论rdd了。但Spark2.0之后,强化了Dataframe体系(DF),比如Spark机器学习的Mlib库,现在有两套接口,一套rdd的,一套DF的,而且官方更推荐使用后者。基于DF可以建立表,可以使用SQL,非常的方便,但我还不太熟悉这个体系。

对于本项目的情况,无论RDD还是DF体系都不能原生支持读取zip。但是都可以透明的读取gz,也就是把gz文件(目录)当作txt或csv等格式直接读取。(没卵用啊)

我的方案

搞了两种方案供大家参

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
spark 读取 linux sftp上的文本文件,原jar只支持josn,csv等,增加bcp,txt文件的支持 下面是例子: public static void main(String[] args) throws Exception { SparkConf conf = new SparkConf().setMaster("local").setAppName("SparkDataFrame"); JavaSparkContext javacontext = new JavaSparkContext(conf); SQLContext sqlContext = new SQLContext(javacontext); Dataset<Row> df = sqlContext.read(). format("com.springml.spark.sftp"). option("host", "192.168.1.3"). option("username", "root"). option("password", "111111"). option("fileType", "bcp"). load("/sparktest/sparkfile0.bcp"); /*List<Row> list = df.collectAsList(); for(Row row:list){ String[] words = new String(row.getString(0).getBytes(),0,row.getString(0).length(),"UTF-8").split(" ",-1); for(int i=0;i<words.length;i++){ System.out.println("words==="+words[i]); } }*/ JavaRDD<Row> rowRdd = df.javaRDD(); JavaRDD<Row> words_bcp= rowRdd.map(new Function<Row, Row>() { @Override public Row call(Row row) throws Exception { // TODO Auto-generated method stub String line = row.getString(0); String[] words = new String(line.getBytes(),0,line.getBytes().length,"utf-8").split(" ",-1); return RowFactory.create(words); } }); List<Row> list = words_bcp.collect(); for(Row row:list){ System.out.println("row1=="+row.getString(0)); } df.write().format("com.springml.spark.sftp"). option("host", "192.168.1.3"). option("username", "root"). option("password", "111111"). option("fileType", "bcp"). save("/sparktest/luozhao.bcp"); df.show(); javacontext.close(); }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值