Spark学习笔记-SparkSQL

从json文件创建DataFrame

对于json数据,Spark可以自动创建结构类型

import org.apache.spark.sql._
var sqlContext=new SQLContext(sc)
var dataFrame=sqlContext.jsonFile("D:/account.json")
dataFrame.registerTempTable("Account"); //创建临时表,sql查询中使用
dataFrame.printSchema() 
sqlContext.sql("select * from Account where age>30").collect()

输入图片说明

输入图片说明

从文本文件创建DataFrame

文本文件没有结构,可以使用StructType,StructField来指定模式

import org.apache.spark.sql._
import org.apache.spark.sql.types._
var file=sc.textFile("D:/account.txt")
var schemaString="account_number,balance,name,age,gender"
var schema=StructType(schemaString.split(",").map(field=>StructField(field,StringType,true)))
var rowRDD=file.map(_.split(",")).map(field=>Row(field(0),field(1),field(2),field(3),field(4)))
var dataFrame=new SQLContext(sc).createDataFrame(rowRDD,schema)
dataFrame.registerTempTable("Account"); //创建临时表,指定schama
dataFrame.printSchema()
dataFrame.show() 
val sqlContext=new SQLContext(sc)
sqlContext.sql("select * from Account where age>30").collect()

输入图片说明输入图片说明输入图片说明

使用Case Class

Spark SQL的scala接口支持自动转换一个包含case class的RDD为一个DataFrame

import org.apache.spark.sql._
val sqlContext=new SQLContext(sc)
var file=sc.textFile("D:/account.txt")
//RDD隐士转换为DataFrame
import sqlContext.implicits._
case class AccountInfo(account_number:Int,balance:Double,name:String,age:Int,gender:String)
var lines=file.map(_.split(","))
lines.map(field=>AccountInfo(field(0).toInt,field(1).toDouble,field(2),field(3).toInt,field(4))).toDF()
dataFrame.registerTempTable("Account"); 
dataFrame.printSchema()
dataFrame.show() 
sqlContext.sql("select * from Account where age>30").collect()

输入图片说明

从MySql读取数据

注意导入mysql-connector-java-xx.jar

import org.apache.spark.sql._
val sqlContext=new SQLContext(sc)
val url = "jdbc:mysql://127.0.0.1:3306/test" 
val tableName = "account" 
val prop = new java.util.Properties 
prop.setProperty("user","root") 
prop.setProperty("password","1234") 
val dataFrame= sqlContext.read.jdbc(url,tableName,prop) 
dataFrame.registerTempTable("Account"); 
dataFrame.printSchema()
dataFrame.show() 
sqlContext.sql("select * from Account where age>30").collect().foreach(println)

输入图片说明输入图片说明输入图片说明

转载于:https://my.oschina.net/Endless2010/blog/1483807

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值