默认是从hdfs读取文件,也可以指定sc.textFile("路径").在路径前面加上hdfs://表示从hdfs文件系统上读
  本地文件读取 sc.textFile("路径").在路径前面加上file:// 表示从本地文件系统读,如file:///home/user/spark/README.md


网上很多例子,包括官网的例子,都是用textFile来加载一个文件创建RDD,类似sc.textFile("hdfs://n1:8020/user/hdfs/input")

textFile的参数是一个path,这个path可以是:

1. 一个文件路径,这时候只装载指定的文件

2. 一个目录路径,这时候只装载指定目录下面的所有文件(不包括子目录下面的文件

3. 通过通配符的形式加载多个文件或者加载多个目录下面的所有文件

第三点是一个使用小技巧,现在假设我的数据结构为先按天分区,再按小时分区的,在hdfs上的目录结构类似于:

/user/hdfs/input/dt=20130728/hr=00/

/user/hdfs/input/dt=20130728/hr=01/

...

/user/hdfs/input/dt=20130728/hr=23/

具体的数据都在hr等于某个时间的目录下面,现在我们要分析20130728这一天的数据,我们就必须把这个目录下面的所有hr=*的子目录下面的数据全部装载进RDD,于是我们可以这样写:sc.textFile("hdfs://n1:8020/user/hdfs/input/dt=20130728/hr=*/"),注意到hr=*,是一个模糊匹配的方式。




package org.apache.spark.examples;

import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import scala.Tuple2;

import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;

public final class JavaWordCount {
    private static final Pattern SPACE = Pattern.compile(" ");

    public static void main(String[] args) throws Exception {
        if (args.length < 2) {
            System.err.println("Usage: JavaWordCount  ");
            System.exit(1);
        }

        JavaSparkContext ctx = new JavaSparkContext(args[0],
                "JavaWordCount",
                System.getenv("SPARK_HOME"),
                JavaSparkContext.jarOfClass(JavaWordCount.class));
        JavaRDD lines = ctx.textFile(args[1], 1);

        JavaRDD words = lines.flatMap(
                new FlatMapFunction() {
                    @Override
                    public Iterable call(String s) {
                        return Arrays.asList(SPACE.split(s));
                    }
                });

        JavaPairRDD ones = words.map(
                new PairFunction() {
                    @Override
                    public Tuple2 call(String s) {
                        return new Tuple2(s, 1);
                    }
                });

        JavaPairRDD counts = ones.reduceByKey(
                new Function2() {
                    @Override
                    public Integer call(Integer i1, Integer i2) {
                        return i1 + i2;
                    }
                });

        List> output = counts.collect();
        for (Tuple2 tuple : output) {
            System.out.println(tuple._1() + ": " + tuple._2());
        }
        System.exit(0);
    }
}



counts.saveAsTextFile("/home/wyp/result");

或者:

counts.saveAsHadoopFile("/home/wyp/result",
                                Text.class,
                         IntWritable.class,
                   TextOutputFormat.class);


http://www.iteblog.com/archives/1028