Spark 简单实例(基本操作)

1、准备文件
?
1
wget http: //statweb.stanford.edu/~tibs/ElemStatLearn/datasets/spam.data

2、加载文件
?
1
scala> val inFile = sc.textFile( "/home/scipio/spam.data" )

  输出

?
1
2
3
14 / 06 / 28  12 : 15 : 34  INFO MemoryStore: ensureFreeSpace( 32880 ) called with curMem= 65736 , maxMem= 311387750
14 / 06 / 28  12 : 15 : 34  INFO MemoryStore: Block broadcast_2 stored as values to memory (estimated size  32.1  KB, free  296.9  MB)
inFile: org.apache.spark.rdd.RDD[String] = MappedRDD[ 7 ] at textFile at <console>: 12

3、显示一行
?
1
scala> inFile.first()

  输出

?
1
2
3
4
5
6
7
8
9
10
14 / 06 / 28  12 : 15 : 39  INFO FileInputFormat: Total input paths to process :  1
14 / 06 / 28  12 : 15 : 39  INFO SparkContext: Starting job: first at <console>: 15
14 / 06 / 28  12 : 15 : 39  INFO DAGScheduler: Got job  0  (first at <console>: 15 ) with  1  output partitions (allowLocal= true )
14 / 06 / 28  12 : 15 : 39  INFO DAGScheduler: Final stage: Stage  0 (first at <console>: 15 )
14 / 06 / 28  12 : 15 : 39  INFO DAGScheduler: Parents of  final  stage: List()
14 / 06 / 28  12 : 15 : 39  INFO DAGScheduler: Missing parents: List()
14 / 06 / 28  12 : 15 : 39  INFO DAGScheduler: Computing the requested partition locally
14 / 06 / 28  12 : 15 : 39  INFO HadoopRDD: Input split: file:/home/scipio/spam.data: 0 + 349170
14 / 06 / 28  12 : 15 : 39  INFO SparkContext: Job finished: first at <console>: 15 , took  0.532360118  s
res2: String =  0  0.64  0.64  0  0.32  0  0  0  0  0  0  0.64  0  0  0  0.32  0  1.29  1.93  0  0.96  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0.778  0  0  3.756  61  278  1

该命令表明:spark加载文件是按行加载,每行为一个字符串,这样一个RDD[String]字符串数组就可以将整个文件存到内存中。

4、函数运用
 (1)map
?
1
2
3
4
5
6
7
8
9
10
11
12
13
scala> val nums = inFile.map(x=>x.split( ' ' ).map(_.toDouble))
nums: org.apache.spark.rdd.RDD[Array[Double]] = MappedRDD[ 8 ] at map at <console>: 14
 
scala> nums.first()
14 / 06 / 28  12 : 19 : 07  INFO SparkContext: Starting job: first at <console>: 17
14 / 06 / 28  12 : 19 : 07  INFO DAGScheduler: Got job  1  (first at <console>: 17 ) with  1  output partitions (allowLocal= true )
14 / 06 / 28  12 : 19 : 07  INFO DAGScheduler: Final stage: Stage  1 (first at <console>: 17 )
14 / 06 / 28  12 : 19 : 07  INFO DAGScheduler: Parents of  final  stage: List()
14 / 06 / 28  12 : 19 : 07  INFO DAGScheduler: Missing parents: List()
14 / 06 / 28  12 : 19 : 07  INFO DAGScheduler: Computing the requested partition locally
14 / 06 / 28  12 : 19 : 07  INFO HadoopRDD: Input split: file:/home/scipio/spam.data: 0 + 349170
14 / 06 / 28  12 : 19 : 07  INFO SparkContext: Job finished: first at <console>: 17 , took  0.011412903  s
res3: Array[Double] = Array( 0.0 0.64 0.64 0.0 0.32 0.0 0.0 0.0 0.0 0.0 0.0 0.64 0.0 0.0 0.0 0.32 0.0 1.29 1.93 0.0 0.96 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.778 0.0 0.0 3.756 61.0 278.0 1.0 )

这里的命令行:将每行的字符串转换为相应的一个double数组,这样全部的数据将可以用一个二维的数组 RDD[Array[Double]]来表示了
(2)collecct
?
1
2
3
4
5
6
7
8
9
scala> val rdd = sc.parallelize(List( 1 , 2 , 3 , 4 , 5 ))
rdd: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[ 9 ] at parallelize at <console>: 12
 
scala> val mapRdd = rdd.map( 2 *_)
mapRdd: org.apache.spark.rdd.RDD[Int] = MappedRDD[ 10 ] at map at <console>: 14
 
scala> mapRdd.collect
14 / 06 / 28  12 : 24 : 45  INFO SparkContext: Job finished: collect at <console>: 17 , took  1.789249751  s
res4: Array[Int] = Array( 2 4 6 8 10 )

 (3)filter
?
1
2
3
4
5
6
scala> val filterRdd = sc.parallelize(List( 1 , 2 , 3 , 4 , 5 )).map(_* 2 ).filter(_> 5 )
filterRdd: org.apache.spark.rdd.RDD[Int] = FilteredRDD[ 13 ] at filter at <console>: 12
 
scala> filterRdd.collect
14 / 06 / 28  12 : 27 : 45  INFO SparkContext: Job finished: collect at <console>: 15 , took  0.056086178  s
res5: Array[Int] = Array( 6 8 10 )

 (4)flatMap
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
scala> val rdd = sc.textFile( "/home/scipio/README.md" )
14 / 06 / 28  12 : 31 : 55  INFO MemoryStore: ensureFreeSpace( 32880 ) called with curMem= 98616 , maxMem= 311387750
14 / 06 / 28  12 : 31 : 55  INFO MemoryStore: Block broadcast_3 stored as values to memory (estimated size  32.1  KB, free  296.8  MB)
rdd: org.apache.spark.rdd.RDD[String] = MappedRDD[ 15 ] at textFile at <console>: 12
 
scala> rdd.count
14 / 06 / 28  12 : 32 : 50  INFO SparkContext: Job finished: count at <console>: 15 , took  0.341167662  s
res6: Long =  127
 
scala> rdd.cache
res7: rdd.type = MappedRDD[ 15 ] at textFile at <console>: 12
 
scala> rdd.count
14 / 06 / 28  12 : 33 : 00  INFO SparkContext: Job finished: count at <console>: 15 , took  0.32015745  s
res8: Long =  127
 
scala> val wordCount = rdd.flatMap(_.split( ' ' )).map(x=>(x, 1 )).reduceByKey(_+_)
wordCount: org.apache.spark.rdd.RDD[(String, Int)] = MapPartitionsRDD[ 20 ] at reduceByKey at <console>: 14
 
scala> wordCount.collect
 
res9: Array[(String, Int)] = Array((means, 1 ), (under, 2 ), ( this , 4 ), (Because, 1 ), (Python, 2 ), (agree, 1 ), (cluster., 1 ), (its, 1 ), (YARN,, 3 ), (have, 2 ), (pre-built, 1 ), (MRv1,, 1 ), (locally., 1 ), (locally, 2 ), (changed, 1 ), (several, 1 ), (only, 1 ), (sc.parallelize( 1 , 1 ), (This, 2 ), (basic, 1 ), (first, 1 ), (requests, 1 ), (documentation, 1 ), (Configuration, 1 ), (MapReduce, 2 ), (without, 1 ), (setting, 1 ), ( "yarn-client" , 1 ), ([params]`., 1 ), (any, 2 ), (application, 1 ), (prefer, 1 ), (SparkPi, 2 ), (<http: //spark.apache.org/>,1), (version,3), (file,1), (documentation,,1), (test,1), (MASTER,1), (entry,1), (example,3), (are,2), (systems.,1), (params,1), (scala>,1), (<artifactId>hadoop-client</artifactId>,1), (refer,1), (configure,1), (Interactive,2), (artifact,1), (can,7), (file's,1), (build,3), (when,2), (2.0.X,,1), (Apac...
 
scala> wordCount.saveAsTextFile( "/home/scipio/wordCountResult.txt" )

 (5)union
?
1
2
3
4
5
6
7
8
9
10
11
12
scala> val rdd = sc.parallelize(List(( 'a' , 1 ),( 'a' , 2 )))
rdd: org.apache.spark.rdd.RDD[(Char, Int)] = ParallelCollectionRDD[ 10 ] at parallelize at <console>: 12
 
scala> val rdd2 = sc.parallelize(List(( 'b' , 1 ),( 'b' , 2 )))
rdd2: org.apache.spark.rdd.RDD[(Char, Int)] = ParallelCollectionRDD[ 11 ] at parallelize at <console>: 12
 
scala> rdd union rdd2
res3: org.apache.spark.rdd.RDD[(Char, Int)] = UnionRDD[ 12 ] at union at <console>: 17
 
scala> res3.collect
 
res4: Array[(Char, Int)] = Array((a, 1 ), (a, 2 ), (b, 1 ), (b, 2 ))

 (6) join
?
1
2
3
4
5
6
7
8
9
10
11
12
scala> val rdd1 = sc.parallelize(List(( 'a' , 1 ),( 'a' , 2 ),( 'b' , 3 ),( 'b' , 4 )))
rdd1: org.apache.spark.rdd.RDD[(Char, Int)] = ParallelCollectionRDD[ 10 ] at parallelize at <console>: 12
 
scala> val rdd2 = sc.parallelize(List(( 'a' , 5 ),( 'a' , 6 ),( 'b' , 7 ),( 'b' , 8 )))
rdd2: org.apache.spark.rdd.RDD[(Char, Int)] = ParallelCollectionRDD[ 11 ] at parallelize at <console>: 12
 
scala> rdd1 join rdd2
res1: org.apache.spark.rdd.RDD[(Char, (Int, Int))] = FlatMappedValuesRDD[ 14 ] at join at <console>: 17
 
res1.collect
 
res2: Array[(Char, (Int, Int))] = Array((b,( 3 , 7 )), (b,( 3 , 8 )), (b,( 4 , 7 )), (b,( 4 , 8 )), (a,( 1 , 5 )), (a,( 1 , 6 )), (a,( 2 , 5 )), (a,( 2 , 6 )))

 (7)lookup
?
1
2
3
val rdd1 = sc.parallelize(List(( 'a' , 1 ),( 'a' , 2 ),( 'b' , 3 ),( 'b' , 4 )))
rdd1.lookup( 'a' )
res3: Seq[Int] = WrappedArray( 1 2 )

 (8)groupByKey
?
1
2
3
4
5
val wc = sc.textFile( "/home/scipio/README.md" ).flatMap(_.split( ' ' )).map((_, 1 )).groupByKey
wc.collect
 
14 / 06 / 28  12 : 56 : 14  INFO SparkContext: Job finished: collect at <console>: 15 , took  2.933392093  s
res0: Array[(String, Iterable[Int])] = Array((means,ArrayBuffer( 1 )), (under,ArrayBuffer( 1 1 )), ( this ,ArrayBuffer( 1 1 1 1 )), (Because,ArrayBuffer( 1 )), (Python,ArrayBuffer( 1 1 )), (agree,ArrayBuffer( 1 )), (cluster.,ArrayBuffer( 1 )), (its,ArrayBuffer( 1 )), (YARN,,ArrayBuffer( 1 1 1 )), (have,ArrayBuffer( 1 1 )), (pre-built,ArrayBuffer( 1 )), (MRv1,,ArrayBuffer( 1 )), (locally.,ArrayBuffer( 1 )), (locally,ArrayBuffer( 1 1 )), (changed,ArrayBuffer( 1 )), (sc.parallelize( 1 ,ArrayBuffer( 1 )), (only,ArrayBuffer( 1 )), (several,ArrayBuffer( 1 )), (This,ArrayBuffer( 1 1 )), (basic,ArrayBuffer( 1 )), (first,ArrayBuffer( 1 )), (documentation,ArrayBuffer( 1 )), (Configuration,ArrayBuffer( 1 )), (MapReduce,ArrayBuffer( 1 1 )), (requests,ArrayBuffer( 1 )), (without,ArrayBuffer( 1 )), ( "yarn-client" ,ArrayBuffer( 1 )), ([params]`.,Ar...

 (9)sortByKey
?
1
2
3
4
val rdd = sc.textFile( "/home/scipio/README.md" )
val wordcount = rdd.flatMap(_.split( ' ' )).map((_, 1 )).reduceByKey(_+_)
val wcsort = wordcount.map(x => (x._2,x._1)).sortByKey( false ).map(x => (x._2,x._1))
wcsort.saveAsTextFile( "/home/scipio/sort.txt" )

 升序的话,sortByKey(true)

### Apache Spark DataFrame 基本操作 #### 创建 DataFrame 可以通过多种方式创建 DataFrame,包括但不限于从 CSV 文件读取数据、从 JSON 文件加载以及通过 JDBC 连接外部数据库。 对于 CSV 文件而言,设置 `header` 参数为 `"true"` 可以让 Spark 将第行作为列名处理,并指定分隔符来解析字段[^2]: ```scala val df_csv = spark.read.option("header", "true").option("sep", ";").csv("/path/to/csv") ``` 当涉及到本地文件而非 HDFS 中的数据源时,在路径前面加上 `file://` 是必要的做法[^4]: ```scala val people = spark.read.format("json").load("file:///local/path/to/json") ``` 另外,利用 JDBC 接口能够方便地把关系型数据库中的表转换成 DataFrame 对象。这通常涉及提供 URL 地址、目标表格名称以及其他可能的身份验证属性等信息: ```scala spark.read.jdbc(url, table, connectionProperties) ``` #### 查看 DataFrame 数据 旦有了 DataFrame 实例之后,就可以调用 `.show()` 方法显示其部分内容以便快速预览数据集结构和样本记录[^5]: ```scala people.show() ``` 此命令将以表格形式打印出前二十条记录,默认情况下每列宽度被截断到定长度以内;当然也可以传递参数调整这些行为。 #### 查询与过滤 借助于强大的 SQL 风格 API 或者更灵活的 DSL 表达式来进行复杂查询成为可能。例如筛选特定条件下的子集合: ```scala // 使用SQL风格API df.createOrReplaceTempView("temp_table") hiveContext.sql("SELECT * FROM temp_table WHERE age > 30") // 使用DSL表达式 df.filter($"age" > 30) ``` 上述两种方法都能实现相同的功能—选取年龄大于三十岁的个体组成新的 DataFrame。 #### 转换与聚合 除了简单的选择外,还可以执行诸如按组汇总统计量之类的操作。下面的例子展示了如何计算每个名字对应的平均年龄并按照降序排列结果: ```scala import org.apache.spark.sql.functions._ df.groupBy("name").agg(avg("age")).orderBy(desc("avg(age)")) ``` 这里引入了额外的帮助函数库用于简化某些常见模式的操作定义过程。 #### 存储结果 最后步往往是保存经过加工后的中间产物供后续分析阶段使用。支持的目标格式众多,涵盖了 Parquet、ORC 等高效存储方案[^1]。 ```scala transformedDf.write.parquet("/output/location") ``` 以上便是关于 Apache Spark DataFrame 的些基本概念及其典型应用场景介绍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值