一. 创建DataFrame
1. 读取json文件创建DataFrame
1. 说明
- json文件中的json数据不能嵌套json格式数据。
- DataFrame是一个一个Row类型的RDD,df.rdd()/df.javaRdd()。
- 可以两种方式读取json格式的文件。
- df.show()默认显示前20行数据。
- DataFrame原生API可以操作DataFrame(不方便)。
- 注册成临时表时,表中的列默认按ascii顺序显示列。
2. 案例
-
Scala代码
val conf: SparkConf = new SparkConf() conf.setMaster("local").setAppName("SQL") val sc: SparkContext = new SparkContext(conf) sc.setLogLevel("Error") val sQLContext: SQLContext = new SQLContext(sc) // 创建DataFrame // val frame: DataFrame = sQLContext.read.format("json").load("./data/person.json") val df: DataFrame = sQLContext.read.json("./data/person.json") // 等价于: select name, age from table // df.select(df.col("name"), df.col("age")).show() // 等价于: select name, age from table where age > 20 // df.select(df.col("name"), df.col("age")).where(df.col("age") > 20).show() // 等价于: select count(*) from table group by age // df.groupBy(df.col("age")).count().show() df.groupBy(df.col("age")).count().show() // 创建临时表 df.registerTempTable("people") // 等价于: select * from people // sQLContext.sql("select * from people").show() // sQLContext.sql("select * from people where age > 20").show() // sQLContext.sql("select age, count(*) from people group by age").show() // sqlDf.show() sc.stop()
-
Java代码
SparkConf conf = new SparkConf(); conf.setMaster("local").setAppName("SQL"); JavaSparkContext sc = new JavaSparkContext(conf); sc.setLogLevel("Error"); SQLContext sqlContext = new SQLContext(sc); // Dataset<Row> dataset = sqlContext.read().format("json").load("./data/person.json"); Dataset<Row> dataset = sqlContext.read().json("./data/person.json"); dataset.show();
2. 通过json格式的RDD创建DataFrame
-
scala代码
val conf: SparkConf = new SparkConf() conf.setMaster("local").setAppName("SQL") val sc: SparkContext = new SparkContext(conf) sc.setLogLevel("Error") val sQLContext: SQLContext = new SQLContext(sc) val nameRDD: RDD[String] = sc.makeRDD(Array( "{\"name\": \"张三\", \"age\": 20}", "{\"name\": \"李四\", \"age\": 18}", "{\"name\": \"王五\", \"age\": 21}" )) val scoreRDD: RDD[String] = sc.makeRDD(Array( "{\"name\": \"张三\", \"score\": 89}", "{\"name\": \"李四\", \"score\": 88}", "{\"name\": \"王五\", \"score\": 90}" )) val nameDF: DataFrame = sQLContext.read.json(nameRDD) val scoreDF: DataFrame = sQLContext.read.json(scoreRDD) // nameDF.select(nameDF.col("name"), nameDF.col("age")).show() // scoreDF.select(scoreDF.col("name"), scoreDF.col("score")).show() nameDF.registerTempTable("name") scoreDF.registerTempTable("score") sQLContext.sql("select name, age from name").show() sQLContext.sql("select name, score from score").show() sQLContext.sql("select name.name, age, score from name, score where name.name = score.name").show()