初學spark基本操作SparkSession、Dataset

RDD的具體描述RDD(彈性分佈式數據集)是Spark提供的最重要的抽象的概念,它是一種有容錯機制的特殊集合,可以分佈在集羣的節點上,以函數式編操作集合的方式,進行各種並行操作。可以將RDD理解爲一個具有容錯機制的特殊集合,它提供了一種只讀、只能有已存在的RDD變換而來的共享內存,然後將所有數據都加載到內存中,方便進行多次重用。

a.他是分佈式的,可以分佈在多臺機器上,進行計算。

 b.他是彈性的,計算過程中內存不夠時它會和磁盤進行數據交換。

c.這些限制可以極大的降低自動容錯開銷

d.實質是一種更爲通用的迭代並行計算框架,用戶可以顯示的控制計算的中間結果,然後將其自由運用於之後的計算。

對於spark的容錯機制:數據檢查點記錄更新,其中父RDD和子RDD的依賴可分爲 寬依賴窄依賴

窄依賴:子RDD中的每個數據塊只依賴於父RDD中對應的有限個固定的數據塊;例如:map變換,子RDD中的數據塊只依賴於父RDD中對應的一個數據塊。 窄依賴可以在某個計算節點上直接通過計算父RDD的某塊數據計算得到子RDD對應的某塊數據;當數據丟失時,對於窄依賴只需要重新計算丟失的那一塊數據來恢復  

寬依賴:子RDD中的一個數據塊可以依賴於父RDD中的所有數據塊。例如:groupByKey變換,子RDD中的數據塊會依賴於多有父RDD中的數據塊,因爲一個key可能存在於父RDD的任何一個數據塊中。寬依賴則要等到父RDD所有數據都計算完成之後,並且父RDD的計算結果進行hash並傳到對應節點上之後才能計算子RDD。數據丟失時,寬依賴要將祖先RDD中的所有數據塊全部重新計算來恢復。

   ------------- 對於所以在長“血統”鏈特別是有寬依賴的時候,需要在適當的時機設置數據檢查點。也是這兩個特性要求對於不同依賴關係要採取不同的任務調度機制和容錯恢復機制。

原文地址:https://blog.csdn.net/china_demon/article/details/52082429

(1)如何獲取RDD

    a.從共享的文件系統獲取,(如:HDFS)

     b.通過已存在的RDD轉換

     c.將已存在scala集合(只要是Seq對象)並行化 ,通過調用SparkContext的parallelize方法實現

     d.改變現有RDD的之久性;RDD是懶散,短暫的。(RDD的固化:cache緩存至內錯; save保存到分佈式文件系統)

(2)操作RDD的兩個動作

     a.Actions:對數據集計算後直接得到一個值或者一個結果返回給驅動程序;

     b.Transformation:根據數據集創建一個新的數據集,計算後返回一個新RDD;(從RDD生成一個新的RDD)


RDD的操作分爲轉化操作(transformation)和行動操作(action),RDD之所以將操作分成這兩類這是和RDD惰性運算有關,當RDD執行轉化操作時候,實際計算並沒有被執行,只有當RDD執行行動操作時候纔會促發計算任務提交,執行相應的計算操作。區別轉化操作和行動操作也非常簡單,轉化操作就是從一個RDD產生一個新的RDD操作,而行動操作就是進行實際的計算



迴歸正題:

1.創建SparkSession:

//讀取數據庫配置

Properties properties=PropertyKit.loadProperties("config.properties");
SparkConf sparkConf=new SparkConf(true);
sparkConf.setAppName(taskName).setMaster(properties.getProperty("spark_master","local[4]"));

SparkSession spark=SparkSession.builder().config(sparkConf).getOrCreate();

2.利用spark讀取jdbc

Dataset<Row> df_org = spark.read().jdbc(this.properties.getProperty(PropertyKeys.URL_JDBC_SLAVE), "org", this.properties);

3.進行簡單的操作

long countNet = df_org.filter("type=2").count();//過濾在org表中屬性type==2的總條數

------------------------------------

原文地址:https://blog.csdn.net/dark_zhou/article/details/78490635

Dataset<Row> dataset = spark.read().jdbc(connectionProperties.getProperty("url"),"cq_jqxx",connectionProperties).persist();
Dataset<Map> mapDataset = dataset.map(newMapFunction<Row,Map>() {
  @Override
  public Map call(Row row)throws Exception {
  HashMap hashMap =new HashMap();
  //這是一個遍歷操作,row即表示爲當前行數據,get(i)表示當前行的第幾列
  hashMap.put(row.get(0),row.get(1));
  return hashMap;
}
  //轉換爲基本類型時用Encoders>STRING()等對應的基本類型
  // 當使用Encoders.javaSerialization()時當前類需要實現序列化
  },Encoders.javaSerialization(Map.class));
List<Map> maps = mapDataset.collectAsList();

Dataset<Row>相關類型的互相轉換

1.java中List轉爲數組結構(由於經常使用到)
List<String> list = new ArrayList<>();
String[] strings = list.toArray(new String[list.size()]);
2.Dataset<Row>轉爲JavaRDD
JavaRDD<Row> rowJavaRDD = dataset.javaRDD();
3.JavaRDD<ROW>轉爲Dataset<ROW>
  Dataset<Row> dataFrame = sparkSession.createDataFrame(rowJavaRDD,Row.class);
4.利用內部類實現Row轉爲自己需要的Row,例如將某行進行分詞變爲String[]
Dataset<Row> select = dataset.select("label","message");
   JavaRDD<WordParticiple> map = select.javaRDD().map(WordParticiple::parseWordParticiple);
   Dataset<Row> wordParticiple = spark.createDataFrame(map,WordParticiple.class);

內部類對象
public static class WordParticiple{
  private String label;
  private String[] message;
public WordParticiple(String label,String[] message) {
  this.label= label;
  this.message= message;
}
public WordParticiple() {
}
public String getLabel() {
  returnlabel;
}
public void setLabel(String label) {
  this.label= label;
}
public String[] getMessage() {
  return message;
}
public void setMessage(String[] message) {
  this.message= message;
}
public static WordParticiple parseWordParticiple(Row row) throws IOException {
  String string = row.getString(1);
  String[] split = TermTokenizer.split(string);
  return new WordParticiple(row.get(0).toString(),split);
  }
}




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