Spark SQL统计哪个星座的人最喜欢开房

最近看到有个例子很有意思,特地重现下。

使用Spark SQL分析数据

这一步,我们使用Spark SQL按照星座对2000W数据进行分组统计, 看看哪个星座的人最喜欢开房。
当然, 使用纯Spark也可以完成我们的分析, 因为实际Spark SQL最终是利用Spark来完成的。
实际测试中发现这些数据并不是完全遵守一个schema, 有些数据的格式是不对的, 有些数据的数据项也是错误的。 在代码中我们要剔除那么干扰数据。
反正我们用这个数据测试者玩, 并没有严格的要求去整理哪些错误数据。

先看代码:

val sqlContext = new org.apache.spark.sql.SQLContext(sc)

import sqlContext.createSchemaRDD

case class  Customer(name: String, gender: String, ctfId: String, birthday: String, address: String)

val customer = sc.textFile("/mnt/share/2000W/*.csv").map(_.split(",")).filter(line => line.length > 7).map(p => Customer(p(0), p(5), p(4), p(6), p(7))).distinct()

customer.registerTempTable("customer")

def toInt(s: String):Int = {

try {

s.toInt

catch {

case e:Exception => 9999

}

}

def myfun(birthday: String) : String = {

var rt = "未知"

if (birthday.length == 8) {

val md = toInt(birthday.substring(4))

if (md >= 120 & md <= 219)

rt = "水瓶座"

else if  (md >= 220 & md <= 320)

rt = "双鱼座"

else if  (md >= 321 & md <= 420)

rt = "白羊座"

else if  (md >= 421 & md <= 521)

rt = "金牛座"

else if  (md >= 522 & md <= 621)

rt = "双子座"

else if  (md >= 622 & md <= 722)

rt = "巨蟹座"

else if  (md >= 723 & md <= 823)

rt = "狮子座"

else if  (md >= 824 & md <= 923)

rt = "处女座"

else if  (md >= 924 & md <= 1023)

rt = "天秤座"

else if  (md >= 1024 & md <= 1122)

rt = "天蝎座"

else if  (md >= 1123 & md <= 1222)

rt = "射手座"

else if  ((md >= 1223 & md <= 1231) | (md >= 101 & md <= 119))

rt = "摩蝎座"

else

rt = "未知"

}

rt

}

sqlContext.registerFunction("constellation", (x:String) => myfun(x))

var result = sqlContext.sql("SELECT constellation(birthday), count(constellation(birthday)) FROM customer group by constellation(birthday)")

result.collect().foreach(println)

为了使用spark sql,你需要引入 sqlContext.createSchemaRDD. Spark sql一个核心对象就是SchemaRDD。 上面的import可以隐式的将一个RDD转换成SchemaRDD。
接着定义了Customer类,用来映射每一行的数据, 我们只使用每一行很少的信息, 像地址,email等都没用到。
接下来从2000W文件夹中读取所有的csv文件, 创建一个RDD并注册表customer。
因为没有一个内建的函数可以将出生一起映射为星座, 所以我们需要定义一个映射函数myfun, 并把它注册到SparkContext中。 这样我们就可以在sql语句中使用这个函数。 类似地,字符串的length函数当前也不支持, 你可以增加一个这样的函数。 因为有的日期不正确,所有特别增加了一个”未知”的星座。 错误数据可能有两种, 一是日期出错, 而是此行格式不对,将其它字段映射成了出生日期。 我们在分析的时候忽略它们好了。

然后执行一个分组的sql语句。这个sql语句查询结果类型为SchemaRDD, 也继承了RDD所有的操作。
最后将结果打印出来。

[双子座,1406018]

[双鱼座,1509839]

[摩蝎座,2404812]

[金牛座,1406225]

[水瓶座,1635358]

[巨蟹座,1498077]

[处女座,1666009]

[天秤座,1896544]

[白羊座,1409838]

[射手座,1614915]

[未知,160483]

[狮子座,1613529]

看起来魔蝎座的人最喜欢开房了, 明显比其它星座的人要多。

我们也可以分析一下开房的男女比例:

?


1

2

3

......

result = sqlContext.sql("SELECT gender, count(gender) FROM customer where gender = ‘F‘ or gender = ‘M‘ group by gender")

result.collect().foreach(println)

结果显示男女开房的人数大约是2:1

?


1

2

[F,6475461]

[M,12763926]

时间: 2024-10-14 02:57:58

Spark SQL统计哪个星座的人最喜欢开房的相关文章

Spark SQL源码分析之核心流程

自从去年Spark Submit 2013 Michael Armbrust分享了他的Catalyst,到至今1年多了,Spark SQL的贡献者从几人到了几十人,而且发展速度异常迅猛,究其原因,个人认为有以下2点: 1.整合:将SQL类型的查询语言整合到 Spark 的核心RDD概念里.这样可以应用于多种任务,流处理,批处理,包括机器学习里都可以引入Sql. 2.效率:因为Shark受到hive的编程模型限制,无法再继续优化来适应Spark模型里. 前一段时间测试过Shark,并且对Spark

Spark SQL源代码分析之核心流程

/** Spark SQL源代码分析系列文章*/ 自从去年Spark Submit 2013 Michael Armbrust分享了他的Catalyst,到至今1年多了,Spark SQL的贡献者从几人到了几十人,并且发展速度异常迅猛,究其原因,个人觉得有下面2点: 1.整合:将SQL类型的查询语言整合到 Spark 的核心RDD概念里.这样能够应用于多种任务,流处理,批处理,包含机器学习里都能够引入Sql. 2.效率:由于Shark受到hive的编程模型限制,无法再继续优化来适应Spark模型

第一篇:Spark SQL源码分析之核心流程

/** Spark SQL源码分析系列文章*/ 自从去年Spark Submit 2013 Michael Armbrust分享了他的Catalyst,到至今1年多了,Spark SQL的贡献者从几人到了几十人,而且发展速度异常迅猛,究其原因,个人认为有以下2点: 1.整合:将SQL类型的查询语言整合到 Spark 的核心RDD概念里.这样可以应用于多种任务,流处理,批处理,包括机器学习里都可以引入Sql.    2.效率:因为Shark受到hive的编程模型限制,无法再继续优化来适应Spark

平易近人、兼容并蓄——Spark SQL 1.3.0概览

摘要:DataFrame API的引入一改RDD API高冷的FP姿态,令Spark变得更加平易近人.外部数据源API体现出的则是兼容并蓄,Spark SQL多元一体的结构化数据处理能力正在逐渐释放. 关于作者:连城,Databricks工程师,Spark committer,Spark SQL主要开发者之一.在4月18日召开的 2015 Spark技术峰会上,连城将做名为"四两拨千斤--Spark SQL结构化数据分析"的主题演讲. 自2013年3月面世以来,Spark SQL已经成

spark sql 操作

DSL风格语法 1.查看DataFrame中的内容 scala> df1.show +---+--------+---+ | id| name|age| +---+--------+---+ | 1|zhansgan| 16| | 2| lisi| 18| | 3| wangwu| 21| | 4|xiaofang| 22| +---+--------+---+ 2.查看DataFrame部分列的数据 scala> df1.select(df1.col("name")).s

SQL数据分析概览——Hive、Impala、Spark SQL、Drill、HAWQ 以及Presto+druid

转自infoQ! 根据 O'Reilly 2016年数据科学薪资调查显示,SQL 是数据科学领域使用最广泛的语言.大部分项目都需要一些SQL 操作,甚至有一些只需要SQL. 本文涵盖了6个开源领导者:Hive.Impala.Spark SQL.Drill.HAWQ 以及Presto,还加上Calcite.Kylin.Phoenix.Tajo 和Trafodion.以及2个商业化选择Oracle Big Data SQL 和IBM Big SQL,IBM 尚未将后者更名为"Watson SQL&q

Spark SQL中的broadcast join分析

在Spark-1.6.2中,执行相同join查询语句,broadcast join模式下,DAG和执行时间如下图所示: 1.broadcast join (1)DAG (2)执行时间 122 rows selected (22.709 seconds) 2.非broadcast join (1)DAG (2)执行时间 122 rows selected (55.512 seconds) 对于broadcast join模式,会将小于spark.sql.autoBroadcastJoinThres

spark sql的简单操作

测试数据 sparkStu.text zhangxs 24 chenxy wangYr 21 teacher wangx 26 teacher sparksql { "name":"zhangxs","age":24,"job":"chengxy", "name":"li","age":21,"job":"teache

前世今生:Hive、Shark、spark SQL

Hive (http://en.wikipedia.org/wiki/Apache_Hive )(非严格的原文顺序翻译)  Apache Hive是一个构建在Hadoop上的数据仓库框架,它提供数据的概要信息.查询和分析功能.最早是Facebook开发的,现在也被像Netflix这样的公司使用.Amazon维护了一个为自己定制的分支.   Hive提供了一个类SQL的语音--HiveQL,它将对关系数据库的模式操作转换为Hadoop的map/reduce.Apache Tez和Spark 执行引