Spark SQL使用

【读取JSON数据源】
开启Hadoop和YARN
cd /usr/local/hadoop
./sbin/start-dfs.sh
./sbin/start-yarn.sh


关闭Hadoop和YARN
cd /usr/local/hadoop
./sbin/stop-dfs.sh
./sbin/stop-yarn.sh

cat /usr/local/spark/examples/src/main/resources/people.json


启动Spark
cd /usr/local/spark
./bin/spark-shell


执行如下命令导入数据源
val df = sqlContext.read.json("file:///usr/local/spark/examples/src/main/resources/people.json")
df.show()


DataFrames 处理结构化数据的一些基本操作
df.select("name").show() // 只显示 "name" 列
df.select(df("name"), df("age") + 1).show() // 将 "age" 加 1
df.filter(df("age") > 21).show() # 条件语句
df.groupBy("age").count().show() // groupBy 操作

使用 SQL 语句来进行操作
df.registerTempTable("people") // 将 DataFrame 注册为临时表 people
val result = sqlContext.sql("SELECT name, age FROM people WHERE age >= 13 AND age <= 19") // 执行 SQL 查询
result.show() // 输出结果
————————————————————————————————————————————————————————————
【读取txt文件】
http://www.infoq.com/cn/articles/apache-spark-sql/


下述代码片段展示了可以在Spark Shell终端执行的Spark SQL命令
cd /usr/local/spark
./bin/spark-shell

// 首先用已有的Spark Context对象创建SQLContext对象
val sqlContext = new org.apache.spark.sql.SQLContext(sc)

// 导入语句,可以隐式地将RDD转化成DataFrame
import sqlContext.implicits._

// 创建一个表示客户的自定义类
case class Customer(customer_id: Int, name: String, city: String, state: String, zip_code: String)


val dfCustomers = sc.textFile("file:///home/hadoop/customers.txt").map(_.split(",")).map(p => Customer(p(0).trim.toInt, p(1), p(2), p(3), p(4))).toDF() // 用数据集文本文件创建一个Customer对象的DataFrame


dfCustomers.registerTempTable("customers") // 将DataFrame注册为一个表


dfCustomers.show() // 显示DataFrame的内容


// 打印DF模式
dfCustomers.printSchema()

// 选择客户名称列
dfCustomers.select("name").show()

// 选择客户名称和城市列
dfCustomers.select("name", "city").show()

// 根据id选择客户
dfCustomers.filter(dfCustomers("customer_id").equalTo(500)).show()

// 根据邮政编码统计客户数量
dfCustomers.groupBy("zip_code").count().show()

————————————————————————————————————————————————————————————
模式是通过反射而得来的。我们也可以通过编程的方式指定数据集的模式。这种方法在由于数据的结构以字符串的形式编码而无法提前定义定制类的情况下非常实用

// 用编程的方式指定模式

// 用已有的Spark Context对象创建SQLContext对象
val sqlContext = new org.apache.spark.sql.SQLContext(sc)

// 创建RDD对象
val rddCustomers = sc.textFile("data/customers.txt")

// 用字符串编码模式
val schemaString = "customer_id name city state zip_code"

// 导入Spark SQL数据类型和Row
import org.apache.spark.sql._

import org.apache.spark.sql.types._;

// 用模式字符串生成模式对象
val schema = StructType(schemaString.split(" ").map(fieldName => StructField(fieldName, StringType, true)))

// 将RDD(rddCustomers)记录转化成Row。
val rowRDD = rddCustomers.map(_.split(",")).map(p => Row(p(0).trim,p(1),p(2),p(3),p(4)))

// 将模式应用于RDD对象。
val dfCustomers = sqlContext.createDataFrame(rowRDD, schema)

// 将DataFrame注册为表
dfCustomers.registerTempTable("customers")

// 用sqlContext对象提供的sql方法执行SQL语句。
val custNames = sqlContext.sql("SELECT name FROM customers")

// SQL查询的返回结果为DataFrame对象,支持所有通用的RDD操作。
// 可以按照顺序访问结果行的各个列。
custNames.map(t => "Name: " + t(0)).collect().foreach(println)

// 用sqlContext对象提供的sql方法执行SQL语句。
val customersByCity = sqlContext.sql("SELECT name,zip_code FROM customers ORDER BY zip_code")

// SQL查询的返回结果为DataFrame对象,支持所有通用的RDD操作。
// 可以按照顺序访问结果行的各个列。
customersByCity.map(t => t(0) + "," + t(1)).collect().foreach(println)
————————————————————————————————————————————————————————————
【user_behavior.txt】
cd /usr/local/hadoop
./sbin/start-dfs.sh
./sbin/start-yarn.sh

cd /usr/local/spark
./bin/spark-shell

cat /home/hadoop/test/user_behavior.txt

val df = sqlContext.read.json("file:///home/hadoop/test/user_behavior.txt")
df.show()


df.select("LBS").show()

df.groupBy("LBS").count().show()


df.groupBy("Behavior").count().show()

 

//使用 SQL 语句来进行操作
df.registerTempTable("behavior") // 将 DataFrame 注册为临时表 behavior
val result = sqlContext.sql("SELECT Behavior FROM behavior WHERE Behavior != '{}'") // 执行 SQL 查询埋点Behavior
result.show() // 输出结果

val result = sqlContext.sql("SELECT * FROM behavior WHERE Behavior != '{}'") // 执行 SQL 查询
result.show() // 输出结果

————————————————————————————————————————————————————————————

posted @ 2016-11-23 22:37  Uncle_Nucky  阅读(218)  评论(0)    收藏  举报