在使用Spark时,我有时会在HIVE表中遇到一个巨大的文件,有时又会尝试处理许多较小的文件。
我明白调整Spark作业的工作方式取决于文件是否是可分割的。在cloudera的这个页面中,它说我们应该意识到文件是否是可分割的:
… 例如,如果您的数据以几个大型不可分割的文件形式到达...
如何知道我的文件是否是可分割的?
如果文件是可分割的,如何知道要使用多少个分区?
如果我想要编写适用于任何HIVE表的代码,即上述两种情况之一,是更好地偏向于更多的分区吗?
在使用Spark时,我有时会在HIVE表中遇到一个巨大的文件,有时又会尝试处理许多较小的文件。
我明白调整Spark作业的工作方式取决于文件是否是可分割的。在cloudera的这个页面中,它说我们应该意识到文件是否是可分割的:
… 例如,如果您的数据以几个大型不可分割的文件形式到达...
如何知道我的文件是否是可分割的?
如果文件是可分割的,如何知道要使用多少个分区?
如果我想要编写适用于任何HIVE表的代码,即上述两种情况之一,是更好地偏向于更多的分区吗?
考虑到Spark接受Hadoop输入文件,看一下下面的图片。
只有bzip2格式的文件是可分割的,而其他格式如zlib、gzip、LZO、LZ4和Snappy格式都是不可分割的。
关于您的查询分区,分区不取决于您要使用的文件格式。它取决于文件中的内容 - 分区列的值,例如日期等。
编辑1: 请参阅此SE问答以及Spark读取压缩文件的此工作代码。
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文件就可以被分割。
有关更多详细信息,请参阅此文章。
sc.textFile(<name-of-file>)
如何在HDFS文件上仍然创建行的RDD?还是不会?我如何确定我的文件格式? - makansij