什么时候是文件" splittable"?

时间:2015-12-10 17:23:34

标签: hadoop apache-spark hive hdfs file-format

当我使用spark时,我有时会在 HIVE 表中遇到一个巨大的文件,我有时会尝试在HIVE表中处理许多较小的文件。

据我所知,在调整火花作业时,它的工作原理取决于文件是否可拆分。在cloudera的this页面中,它说我们应该知道这些文件是否可以拆分:

  

...例如,如果您的数据到达几个大的不可分割文件......

  1. 如何知道我的文件是否可拆分?

  2. 如果文件可拆分,我如何知道要使用的分区数?

  3. 如果我试图写一段可以在任何HIVE表上工作的代码,即上述两种情况中的任何一种,那么在更多分区方面犯错是否更好?

1 个答案:

答案 0 :(得分:7)

考虑到Spark接受Hadoop输入文件,请查看下图。

只有bzip2格式的文件是可拆分的,其他格式如zlib, gzip, LZO, LZ4 and Snappy格式不可拆分。

关于您对分区的查询,分区不依赖于您将要使用的文件格式。它取决于文件中的内容 - 分区列的值,如日期等。

enter image description here

编辑1: 在Spark阅读zip文件中查看此SE问题和此working code

JavaPairRDD<String, String> fileNameContentsRDD = javaSparkContext.wholeTextFiles(args[0]);
        JavaRDD<String> lineCounts = fileNameContentsRDD.map(new Function<Tuple2<String, String>, String>() {
            @Override
            public String call(Tuple2<String, String> fileNameContent) throws Exception {
                String content = fileNameContent._2();
                int numLines = content.split("[\r\n]+").length;
                return fileNameContent._1() + ":  " + numLines;
            }
        });
        List<String> output = lineCounts.collect();

编辑2:

LZO文件可以拆分。

  只要分割发生在块边界

,就可以分割LZO文件

有关详细信息,请参阅此article