在spark-1.3新加的最重要的新特性之一dataframe的引入,很類似在r語言中的dataframe的操作,使得spark-sql更穩定高效。
1、dataframe簡介:
在spark中,dataframe是一種以rdd為基礎的分布式資料據集,類似於傳統資料庫聽二維**,dataframe帶有schema元資訊,即dataframe所表示的二維表資料集的每一列都帶有名稱和型別。
類似這樣的
root
|-- age: long (nullable = true)
|-- id: long (nullable = true)
|-- name: string (nullable = true)
2、準備測試結構化資料集
people.json
3、通過程式設計方式理解dataframe
1) 通過dataframe的api來運算元據
import org.apache.spark.sql.sqlcontext
import org.apache.spark.sparkconf
import org.apache.spark.sparkcontext
import org.apache.log4j.level
import org.apache.log4j.logger
object dataframetest
}//foreachpartition 處理各欄位返回值,生產中常用的方式
df.select(df.col("id"), df.col("name"), df.col("age")).foreachpartition )
}}}
2)通過登錄檔,操作sql的方式來運算元據
import org.apache.spark.sql.sqlcontext
import org.apache.spark.sparkconf
import org.apache.spark.sparkcontext
import org.apache.log4j.level
import org.apache.log4j.logger
/** * @author administrator
*/object dataframetest2
}//foreachpartition 處理各欄位返回值,生產中常用的方式
sqlcontext.sql("select id,name,age from people ").foreachpartition )
}}}
兩種方式執行結果是一樣的,第一種適合程式設計師,第二種適合熟悉sql的人員。
4、對於非結構化的資料
people.txt
1,ganymede,32
2, lilei, 19
3, lily, 25
4, hanmeimei, 25
5, lucy, 37
6, wcc, 4
1) 通過字段反射來對映註冊臨時表
import org.apache.spark.sql.sqlcontext
import org.apache.spark.sparkconf
import org.apache.spark.sparkcontext
import org.apache.log4j.level
import org.apache.log4j.logger
import org.apache.spark.sql.types.integertype
import org.apache.spark.sql.types.structtype
import org.apache.spark.sql.types.stringtype
import org.apache.spark.sql.types.structfield
import org.apache.spark.sql.row
/** * @author administrator
*/object dataframetest3 .map
}val structtype = structtype(array(
structfield("id", integertype, true),
structfield("name", stringtype, true),
structfield("age", integertype, true)));
val df = sqlcontext.createdataframe(peoplerowrdd, structtype);
df.registertemptable("people")
df.show()
df.printschema()
}}
2) 通過case class反射來對映註冊臨時表
import org.apache.spark.sql.sqlcontext
import org.apache.spark.sparkconf
import org.apache.spark.sparkcontext
import org.apache.log4j.level
import org.apache.log4j.logger
import org.apache.spark.sql.types.integertype
import org.apache.spark.sql.types.structtype
import org.apache.spark.sql.types.stringtype
import org.apache.spark.sql.types.structfield
import org.apache.spark.sql.row
/** * @author administrator
*/object dataframetest4 .map
}//這裡需要隱式轉換一把
import sqlcontext.implicits._
val df = peoplerdd.todf()
df.registertemptable("people")
df.show()
df.printschema()
}}
5、總結:
spark sql是spark中的乙個模組,主要用於進行結構化資料的處理。它提供的最核心的程式設計抽象,就是dataframe。同時spark sql還可以作為分布式的sql查詢引擎。spark sql最重要的功能之一,就是從hive中查詢資料。
dataframe,可以理解為是,以列的形式組織的,分布式的資料集合。它其實和關係型資料庫中的表非常類似,但是底層做了很多的優化。dataframe可以通過很多**進行構建,包括:結構化的資料檔案,hive中的表,外部的關係型資料庫,以及rdd。
python筆記4 資料結構之DataFrame
coding utf 8 1.概念 資料框。用於儲存多行和多列的資料集合 from pandas import dataframe 2.定義 自動生成索引的方式 df dataframe 自定義索引的方式 df dataframe data index first second third 3.限制...
SparkSQL之更改表結構
本文篇幅較短,內容源於自己在使用sparksql時碰到的乙個小問題,因為在之後的資料處理過程中多次使用,所以為了加深印象,在此單獨成文,以便回顧。在使用sparksql進行資料處理時,碰到這樣一種情況 需要更改dataframe當中某個欄位的型別。簡而言之,就是需要更改sparksql的表結構。出於...
Spark學習之 Spark SQL 一
感謝大牛的系列文章,本文只是本人學習過程的記錄,首先向大神致敬 1.建立檔案people.json 2.上傳到hdfs檔案系統 目錄位置 data people.json hdfs dfs put people.json data3.在hdfs中檢視檔案是否完整,如下 root hd 02 hdfs...