Spark(六):DataFrame

說明

由於某些原因,上週五未發佈博客未,本文補上。 DataFrame是一種spark 1.3版本提供Spark SQL接口下的分佈式數據集,繼承自DataSet數據集,該概念最早由R語言和Pandas庫(Python)提出。 DataFrame更像傳統數據庫裏的表,除了數據外還包含更多的輔助信息,如列名、列值和列的屬性,同時支持一些複雜的數據格式。從API應用的角度,DataFrame提供的API層次更高,比RDD編程方便,學習的門檻更低。

記錄

特性

  1. DataFrame會將數據分割成列,併爲每列取名,概念上等同於關係型數據庫中表或R、Python中的數據框。

  2. 可以處理結構化和非結構化數據格式。例如Avro、CSV、彈性搜索和Cassandra。它還處理存儲系統HDFS、HIVE表、MySQL等。

  3. Catalyst的通用樹轉換框架分爲四個階段,如下所示:

    • 分析解決引用的邏輯計劃
    • 邏輯計劃優化,
    • 物理計劃
    • 代碼生成用於編譯部分查詢生成Java字節碼。

在物理規劃階段,Catalyst可能會生成多個計劃並根據成本進行比較。 所有其他階段完全是基於規則的。 每個階段使用不同類型的樹節點; Catalyst包括用於表達式、數據類型以及邏輯和物理運算符的節點庫。 這些階段如下所示:

接口

  • DataFrame API支持Scala、java、python、R,它作爲行數據集,在Scala API中DataFrame是DataSet[Row]的類型別名,Java中使用數據集表示。
  • SparkSession是所有Spark功能入口,應用程序通過它能從現存RDD或Hive Table、Spark數據源中創建DataFram。Spark SQL能對多種數據源使用DataFrame接口,使用SparkSQL DataFrame創建臨時視圖,然後執行Sql查詢。

一般處理流程

  1. 先創建Spark基礎變量,spark,sc
  2. 加載數據,rdd.textFile,spark.read.csv/json等
  3. 數據處理,mapPartition, map,filter,reduce等一系列transformation操作
  4. 數據保存,saveAstextFile,或者其他DataFrame方法

優點

DataFrame優於RDD,因爲它提供了內存管理和優化執行計劃:

  1. 自定義內存管理,當數據以二進制格式存儲在堆外內存時,將節省大量內存,除此之外,沒有垃圾回收(GC)開銷。同時避免了昂貴的java序列化,因爲數據以二進制格式存儲,且已知內存schema。
  2. 優化執行計劃:也稱爲查詢優化器,查詢執行時,創建一個優化的執行計劃,並將計劃運行在RDD上。

缺點

  1. Spark SQL DataFrame API不支持編譯時類型安全,如果結構未知,不能操作數據。
  2. 一旦將域對象轉化爲DataFrame,域對象不能重構。

代碼實例

java代碼創建簡單DataFrame,JSON格式RDD創建DataFrame:

SparkConf conf = new SparkConf();
conf.setMaster("local").setAppName("jsonRDD");  //主機地址和應用名
JavaSparkContext sc = new JavaSparkContext(conf);
SQLContext sqlContext = new SQLContext(sc);
JavaRDD<String> nameRDD = sc.parallelize(Arrays.asList(
    "{\"name\":\"zhangsan\",\"age\":\"18\"}",
    "{\"name\":\"lisi\",\"age\":\"19\"}",
    "{\"name\":\"wangwu\",\"age\":\"20\"}"
));
JavaRDD<String> scoreRDD = sc.parallelize(Arrays.asList(
"{\"name\":\"zhangsan\",\"score\":\"100\"}",
"{\"name\":\"lisi\",\"score\":\"200\"}",
"{\"name\":\"wangwu\",\"score\":\"300\"}"
));
 
DataFrame namedf = sqlContext.read().json(nameRDD);  //RDD轉換DataFrame
DataFrame scoredf = sqlContext.read().json(scoreRDD); //RDD轉換DataFrame
namedf.registerTempTable("name");  //註冊臨時表
scoredf.registerTempTable("score");
 
DataFrame result = sqlContext.sql("select name.name,name.age,score.score from name,score where name.name = score.name");  //sql查詢 
result.show();
 
sc.stop();

spark與RDD對比

DataFrame與RDD類似,但DataFrame更像傳統數據庫的二維表格,除了數據以外,還掌握數據的結構信息,即schema。同時,與Hive類似,DataFrame也支持嵌套數據類型(struct、array和map)。

總結

spark DataFrame本質是將數據映射爲表,在此基礎上完成sql方式業務功能開發。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章