文章目录
方式一、从内存中创建
1.makeRDD
scala> val df = sc.makeRDD(List("huangmouren","henshuai"))
df: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[66] at makeRDD at <console>:27
2.parallelize
scala> val dc = sc.parallelize(List("huangmouren","henshuai"),2)
dc: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[67] at parallelize at <console>:27
scala> dc.partition
partitioner partitions
scala> dc.partitions.size
res16: Int = 2
区别:makeRDD函数有两种实现,第一种实现其实完全和parallelize一致;而第二种实现可以为数据提供位置信息 区别详解
方式二、从文件系统创建
1.textFile
支持本地文件系统,HDFS, S3等(file:// hdfs:// s3n://);
textFile支持在目录,压缩文件和通配符上运行。例如,你可以使用textFile("/my/directory"),textFile("/my/directory/.txt")和textFile("/my/directory/.gz")。
该textFile方法还采用可选的第二个参数来控制文件的分区数。默认情况下,Spark为文件的每个块创建一个分区(HDFS中默认为128MB),但您也可以通过传递更大的值来请求更多的分区。请注意,您不能拥有比块少的分区。
val rdd3 = sc.textFile("hdfs://192.168.56.122:9000/data/e")
2.wholeTextFiles
与textFile区别为:返回文件名和内容 键值对RDD,其它一样
val rdd4 = sc.wholeTextFiles("hdfs://192.168.56.122:9000/data/e")
3.sequenceFile
读取sequenceFile文件,其中K和V是文件中键和值的类型。这些应该是Hadoop的Writable接口的子类
sc.parallelize(Array("one","two","three")).map((_,1)).repartition(1).saveAsSequenceFile("hdfs://192.168.56.122:9000/data/e")
// SequenceFile 文件读取 Linux读取直接乱码 cat 读取需要使用 -text
[root@hw1 e]# hdfs dfs -text /data/e/part-00000
4、saveAsHadoopFile
saveAsHadoopFile是将RDD存储在HDFS上的文件中,支持老版本Hadoop API。
可以指定outputKeyClass、outputValueClass以及压缩格式。
每个分区输出一个文件。
scala> import org.apache.hadoop.io.Text
scala> import org.apache.hadoop.io.IntWritable
scala> import org.apache.hadoop.mapred.Text
scala> import org.apache.hadoop.mapred.TextOutputFormat
scala> sc.parallelize(Array("one","two","three")).map((_,1)).repartition(1).saveAsHadoopFile("/data/j",classOf[Text],classOf[IntWritable],classOf[TextOutputFormat[Text,IntWritable]])
5.newAPIHadoopRDD
方法采用任意JobConf输入格式类,键类和值类。设置这些与使用输入源的Hadoop作业的方式相同.读hbase如下
val hconf: Configuration = HBaseConfiguration.create
hconf.set("hbase.zookeeper.quorum", "xxx:2181,xxx:2181,xxx:2181")
hconf.set(TableInputFormat.INPUT_TABLE, "xxx")
hconf.set(TableInputFormat.SCAN_COLUMNS, "fields:phone_no fields:contacts_list")
/* hconf.set(TableInputFormat.SCAN_ROW_START,"0");
hconf.set(TableInputFormat.SCAN_ROW_STOP,"10000");*/
val pairRdd = sc.newAPIHadoopRDD(hconf, classOf[TableInputFormat], classOf[ImmutableBytesWritable],classOf[Result])
pairRdd.foreach(println)
完整代码如下
object CreateRDDFun {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setAppName("CreateRDDFun examples").setMaster("local[*]")
val sc = new SparkContext(sparkConf)
/**
* 1.从内存中创建:makeRDD和parallelize
* 区别:makeRDD函数有两种实现,第一种实现其实完全和parallelize一致;而第二种实现可以为数据提供位置信息
*/
create01(sc)
create02(sc)
/**
* 2.从文件系统创建:textFile、wholeTextFiles、sequenceFile、newAPIHadoopRDD
*/
create03(sc)
create04(sc)
create05(sc)
create06(sc)
sc.stop()
}
private def create01(sc: SparkContext): Unit = {
val rdd = sc.parallelize(List("zhangsan", "lisi", "wangwu"))
rdd.foreach(println)
}
private def create02(sc: SparkContext): Unit = {
val rdd2 = sc.makeRDD(List("zhangsan", "lisi", "wangwu"))
rdd2.foreach(println)
}
private def create03(sc: SparkContext): Unit = {
// file:// hdfs:// s3n://
val rdd3 = sc.textFile("file:///D:/github/SparkLearnExample/examples/src/main/resources/people.txt")
rdd3.foreach(println)
}
private def create04(sc: SparkContext): Unit = {
//返回文件名和内容 键值对RDD
val rdd4 = sc.wholeTextFiles("file:///D:/github/SparkLearnExample/examples/src/main/resources")
rdd4.foreach(println)
}
private def create05(sc: SparkContext): Unit = {
//其中K和V是文件中键和值的类型
val rdd5 = sc.sequenceFile("hdfs://xxx", classOf[Text], classOf[Text])
rdd5.foreach(println)
}
private def create06(sc: SparkContext): Unit = {
//方法采用任意JobConf输入格式类,键类和值类。设置这些与使用输入源的Hadoop作业的方式相同.
//读hbase
val hconf: Configuration = HBaseConfiguration.create
hconf.set("hbase.zookeeper.quorum", "xxx:2181,xxx:2181,xxx:2181")
hconf.set(TableInputFormat.INPUT_TABLE, "xxx")
hconf.set(TableInputFormat.SCAN_COLUMNS, "fields:phone_no fields:contacts_list")
/* hconf.set(TableInputFormat.SCAN_ROW_START,"0");
hconf.set(TableInputFormat.SCAN_ROW_STOP,"10000");*/
val pairRdd = sc.newAPIHadoopRDD(hconf, classOf[TableInputFormat], classOf[ImmutableBytesWritable],classOf[Result])
pairRdd.foreach(println)
}
}