textFile函数java
/** * Read a text file from HDFS, a local file system (available on all nodes), or any * Hadoop-supported file system URI, and return it as an RDD of Strings. */ def textFile( path: String, minPartitions: Int = defaultMinPartitions): RDD[String] = withScope { assertNotStopped() hadoopFile(path, classOf[TextInputFormat], classOf[LongWritable], classOf[Text], minPartitions).map(pair => pair._2.toString).setName(path) }分析参数:
path: String 是一个URI,這个URI能够是HDFS、本地文件(所有的节点均可以),或者其余Hadoop支持的文件系统URI返回的是一个字符串类型的RDD,也就是是RDD的内部形式是Iterator[(String)]node
minPartitions= math.min(defaultParallelism, 2) 是指定数据的分区,若是不指定分区,当你的核数大于2的时候,不指定分区数那么就是 2app
当你的数据大于128M时候,Spark是为每个快(block)建立一个分片(Hadoop-2.X以后为128m一个block)函数
一、从当前目录读取一个文件oop
val path = "Current.txt" //Current fold file val rdd1 = sc.textFile(path,2)
从当前目录读取一个Current.txt的文件google
二、从当前目录读取多个文件spa
val path = "Current1.txt,Current2.txt," //Current fold file val rdd1 = sc.textFile(path,2)从当前读取两个文件,分别是Cuttent1.txt和Current2.txt
三、从本地系统读取一个文件scala
val path = "file:///usr/local/spark/spark-1.6.0-bin-hadoop2.6/README.md" //local file val rdd1 = sc.textFile(path,2)从本地系统读取一个文件,名字是README.md
四、从本地系统读取整个文件夹code
val path = "file:///usr/local/spark/spark-1.6.0-bin-hadoop2.6/licenses/" //local file val rdd1 = sc.textFile(path,2)从本地系统中读取licenses这个文件夹下的全部文件
這里特别注意的是,好比這个文件夹下有35个文件,上面分区数设置是2,那么整个RDD的分区数是35*2?orm
這是错误的,這个RDD的分区数无论你的partition数设置为多少时,只要license這个文件夹下的這个文件a.txt
(好比有a.txt)没有超过128m,那么a.txt就只有一个partition。那么就是说只要这35个文件其中没有一个超过
128m,那么分区数就是 35个
五、从本地系统读取多个文件
val path = "file:///usr/local/spark/spark-1.6.0-bin-hadoop2.6/licenses/LICENSE-scala.txt,file:///usr/local/spark/spark-1.6.0-bin-hadoop2.6/licenses/LICENSE-spire.txt" //local file val rdd1 = sc.textFile(path,2)从本地系统中读取file:///usr/local/spark/spark-1.6.0-bin-hadoop2.6/licenses/下的LICENSE-spire.txt和
LICENSE-scala.txt两个文件。上面分区设置是2,那个RDD的整个分区数是2*2
六、从本地系统读取多个文件夹下的文件(把以下文件所有读取进来)
val path = "/usr/local/spark/spark-1.6.0-bin-hadoop2.6/data/*/*" //local file val rdd1 = sc.textFile(path,2)
七、采用通配符,来读取多个文件名相似的文件
好比读取以下文件的people1.txt和people2.txt,但google.txt不读取
for (i <- 1 to 2){ val rdd1 = sc.textFile(s"/root/application/temp/people$i*",2) }八、采用通配符读取相同后缀的文件
val path = "/usr/local/spark/spark-1.6.0-bin-hadoop2.6/data/*/*.txt" //local file val rdd1 = sc.textFile(path,2)
val path = "hdfs://master:9000/examples/examples/src/main/resources/people.txt" val rdd1 = sc.textFile(path,2)从HDFS中读取文件的形式和本地上同样,只是前面的路径要代表是HDFS中的