精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

基于Spark的數(shù)據(jù)分析實踐

大數(shù)據(jù) Spark
本文主要分析了 Spark RDD 以及 RDD 作為開發(fā)的不足之處,介紹了 SparkSQL 對已有的常見數(shù)據(jù)系統(tǒng)的操作方法,以及重點介紹了普元在眾多數(shù)據(jù)開發(fā)項目中總結(jié)的基于 SparkSQL Flow 開發(fā)框架。

引言:

Spark是在借鑒了MapReduce之上發(fā)展而來的,繼承了其分布式并行計算的優(yōu)點并改進(jìn)了MapReduce明顯的缺陷。Spark主要包含了Spark Core、Spark SQL、Spark Streaming、MLLib和GraphX等組件。

本文主要分析了 Spark RDD 以及 RDD 作為開發(fā)的不足之處,介紹了 SparkSQL 對已有的常見數(shù)據(jù)系統(tǒng)的操作方法,以及重點介紹了普元在眾多數(shù)據(jù)開發(fā)項目中總結(jié)的基于 SparkSQL Flow 開發(fā)框架。

目錄:

  1. Spark RDD
  2. 基于Spark RDD數(shù)據(jù)開發(fā)的不足
  3. SparkSQL
  4. SparkSQL Flow

一、Spark RDD

RDD(Resilient Distributed Dataset)叫做彈性分布式數(shù)據(jù)集,是Spark中最基本的數(shù)據(jù)抽象,它代表一個不可變、可分區(qū)、元素可并行計算的集合。

RDD具有數(shù)據(jù)流模型的特點:自動容錯、位置感知性調(diào)度和可伸縮性。

//Scala 在內(nèi)存中使用列表創(chuàng)建

  1. val lines = List(“A”, “B”, “C”, “D” …) 
  2. val rdd:RDD = sc.parallelize(lines); 

//以文本文件創(chuàng)建

  1. val rdd:RDD[String] = sc.textFile(“hdfs://path/filename”) 

Spark RDD Partition 分區(qū)劃分 

基于 Spark 的數(shù)據(jù)分析實踐

新版本的 Hadoop 已經(jīng)把 BlockSize 改為 128M,也就是說每個分區(qū)處理的數(shù)據(jù)量更大。

Spark 讀取文件分區(qū)的核心原理

本質(zhì)上,Spark 是利用了 Hadoop 的底層對數(shù)據(jù)進(jìn)行分區(qū)的 API(InputFormat):

  1. public abstract class InputFormat<K,V>{ 
  2.  public abstract List<InputSplit> getSplits(JobContextcontext 
  3.  ) throwsIOException,InterruptedException; 
  4.   
  5.  public abstract RecordReader<K,V> createRecordReader(InputSplitsplit, 
  6.  TaskAttemptContextcontext 
  7.  )throwsIOException,InterruptedException; 

Spark 任務(wù)提交后通過對輸入進(jìn)行 Split,在 RDD 構(gòu)造階段,只是判斷是否可 Split(如果參數(shù)異常一定在此階段報出異常),并且 Split 后每個 InputSplit 都是一個分區(qū)。只有在Action 算子提交后,才真正用 getSplits 返回的 InputSplit 通過 createRecordReader 獲得每個 Partition 的連接。

然后通過 RecordReader 的 next() 遍歷分區(qū)內(nèi)的數(shù)據(jù)。

Spark RDD 轉(zhuǎn)換函數(shù)和提交函數(shù) 

基于 Spark 的數(shù)據(jù)分析實踐

Spark RDD 的眾多函數(shù)可分為兩大類Transformation 與 Action。Transformation 與 Action 的區(qū)別在于,對 RDD 進(jìn)行 Transformation 并不會觸發(fā)計算:Transformation 方法所產(chǎn)生的 RDD 對象只會記錄住該 RDD 所依賴的 RDD 以及計算產(chǎn)生該 RDD 的數(shù)據(jù)的方式;只有在用戶進(jìn)行 Action 操作時,Spark 才會調(diào)度 RDD 計算任務(wù),依次為各個 RDD 計算數(shù)據(jù)。這就是 Spark RDD 內(nèi)函數(shù)的“懶加載”特性。

二、基于Spark RDD數(shù)據(jù)開發(fā)的不足

由于MapReduce的shuffle過程需寫磁盤,比較影響性能;而Spark利用RDD技術(shù),計算在內(nèi)存中流式進(jìn)行。另外 MapReduce計算框架(API)比較局限, 使用需要關(guān)注的參數(shù)眾多,而Spark則是中間結(jié)果自動推斷,通過對數(shù)據(jù)集上鏈?zhǔn)綀?zhí)行函數(shù)具備一定的靈活性。

即使 SparkRDD 相對于 MapReduce 提高很大的便利性,但在使用上仍然有許多問題。體現(xiàn)在一下幾個方面:

  1. RDD 函數(shù)眾多,開發(fā)者不容易掌握,部分函數(shù)使用不當(dāng) shuffle時造成數(shù)據(jù)傾斜影響性能;
  2. RDD 關(guān)注點仍然是Spark太底層的 API,基于 Spark RDD的開發(fā)是基于特定語言(Scala,Python,Java)的函數(shù)開發(fā),無法以數(shù)據(jù)的視界來開發(fā)數(shù)據(jù);
  3. 對 RDD 轉(zhuǎn)換算子函數(shù)內(nèi)部分常量、變量、廣播變量使用不當(dāng),會造成不可控的異常;
  4. 對多種數(shù)據(jù)開發(fā),需各自開發(fā)RDD的轉(zhuǎn)換,樣板代碼較多,無法有效重利用;
  5. 其它在運行期可能發(fā)生的異常。如:對象無法序列化等運行期才能發(fā)現(xiàn)的異常。

三、SparkSQL

Spark 從 1.3 版本開始原有 SchemaRDD 的基礎(chǔ)上提供了類似Pandas DataFrame API。新的DataFrame API不僅可以大幅度降低普通開發(fā)者的學(xué)習(xí)門檻,同時還支持Scala、Java與Python三種語言。更重要的是,由于脫胎自SchemaRDD,DataFrame天然適用于分布式大數(shù)據(jù)場景。 

基于 Spark 的數(shù)據(jù)分析實踐

一般的數(shù)據(jù)處理步驟:讀入數(shù)據(jù) -> 對數(shù)據(jù)進(jìn)行處理 -> 分析結(jié)果 -> 寫入結(jié)果

SparkSQL 結(jié)構(gòu)化數(shù)據(jù)

  • 處理結(jié)構(gòu)化數(shù)據(jù)(如 CSV,JSON,Parquet 等);
  • 把已經(jīng)結(jié)構(gòu)化數(shù)據(jù)抽象成 DataFrame (HiveTable);
  • 非結(jié)構(gòu)化數(shù)據(jù)通過 RDD.map.filter 轉(zhuǎn)換成結(jié)構(gòu)化進(jìn)行處理;
  • 按照列式數(shù)據(jù)庫,只加載非結(jié)構(gòu)化中可結(jié)構(gòu)化的部分列(Hbase,MongoDB);

處理非結(jié)構(gòu)化數(shù)據(jù),不能簡單的用 DataFrame 裝載。而是要用 SparkRDD 把數(shù)據(jù)讀入,在通過一系列的 Transformer Method 把非結(jié)構(gòu)化的數(shù)據(jù)加工為結(jié)構(gòu)化,或者過濾到不合法的數(shù)據(jù)。

SparkSQL DataFrame 

基于 Spark 的數(shù)據(jù)分析實踐

SparkSQL 中一切都是 DataFrame,all in DataFrame. DataFrame是一種以RDD為基礎(chǔ)的分布式數(shù)據(jù)集,類似于傳統(tǒng)數(shù)據(jù)庫中的二維表格。DataFrame與RDD的主要區(qū)別在于,前者帶有schema元信息,即DataFrame所表示的二維表數(shù)據(jù)集的每一列都帶有名稱和類型。如果熟悉 Python Pandas 庫中的 DataFrame 結(jié)構(gòu),則會對 SparkSQL DataFrame 概念非常熟悉。

TextFile DataFrame

  1. import.org.apache.spark.sql._ 
  2. //定義數(shù)據(jù)的列名稱和類型 
  3. valdt=StructType(List(id:String,name:String,gender:String,age:Int)) 
  4. ​ 
  5. //導(dǎo)入user_info.csv文件并指定分隔符 
  6. vallines = sc.textFile("/path/user_info.csv").map(_.split(",")) 
  7. ​ 
  8. //將表結(jié)構(gòu)和數(shù)據(jù)關(guān)聯(lián)起來,把讀入的數(shù)據(jù)user.csv映射成行,構(gòu)成數(shù)據(jù)集 
  9. valrowRDD = lines.map(x=>Row(x(0),x(1),x(2),x(3).toInt)) 
  10. ​ 
  11. //通過SparkSession.createDataFrame()創(chuàng)建表,并且數(shù)據(jù)表表頭 
  12. val df= spark.createDataFrame(rowRDD, dt) 

讀取規(guī)則數(shù)據(jù)文件作為DataFrame

  1. SparkSession.Builder builder = SparkSession.builder() 
  2. Builder.setMaster("local").setAppName("TestSparkSQLApp"
  3. SparkSession spark = builder.getOrCreate(); 
  4. SQLContext sqlContext = spark.sqlContext(); 
  5. ​ 
  6. # 讀取 JSON 數(shù)據(jù),path 可為文件或者目錄 
  7. valdf=sqlContext.read().json(path); 
  8. ​ 
  9. # 讀取 HadoopParquet 文件 
  10. vardf=sqlContext.read().parquet(path); 
  11. ​ 
  12. # 讀取 HadoopORC 文件 
  13. vardf=sqlContext.read().orc(path); 

JSON 文件為每行一個 JSON 對象的文件類型,行尾無須逗號。文件頭也無須[]指定為數(shù)組;SparkSQL 讀取是只是按照每行一條 JSON Record序列化;

Parquet文件

  1. Configurationconfig = new Configuration(); 
  2. ParquetFileReaderreader = ParquetFileReader.open
  3.  HadoopInputFile.fromPath(new Path("hdfs:///path/file.parquet"),conf)); 
  4. Map<String, String>schema = reader.getFileMetaData().getKeyValueMetaData(); 
  5. String allFields= schema.get("org.apache.spark.sql.parquet.row.metadata"); 

allFiedls 的值就是各字段的名稱和具體的類型,整體是一個json格式進(jìn)行展示。

讀取 Hive 表作為 DataFrame

Spark2 API 推薦通過 SparkSession.Builder 的 Builder 模式創(chuàng)建 SparkContext。 Builder.getOrCreate() 用于創(chuàng)建 SparkSession,SparkSession 是 SparkContext 的封裝。

在Spark1.6中有兩個核心組件SQLcontext和HiveContext。SQLContext 用于處理在 SparkSQL 中動態(tài)注冊的表,HiveContext 用于處理 Hive 中的表。

從Spark2.0以上的版本開始,spark是使用全新的SparkSession接口代替Spark1.6中的SQLcontext和HiveContext。SQLContext.sql 即可執(zhí)行 Hive 中的表,也可執(zhí)行內(nèi)部注冊的表;

在需要執(zhí)行 Hive 表時,只需要在 SparkSession.Builder 中開啟 Hive 支持即可(enableHiveSupport())。

  1. SparkSession.Builder builder = SparkSession.builder().enableHiveSupport(); 
  2. SparkSession spark = builder.getOrCreate(); 
  3. SQLContext sqlContext = spark.sqlContext(); 

// db 指 Hive 庫中的數(shù)據(jù)庫名,如果不寫默認(rèn)為 default

// tableName 指 hive 庫的數(shù)據(jù)表名

  1. sqlContext.sql(“select * from db.tableName”) 

SparkSQL ThriftServer

//首先打開 Hive 的 Metastore服務(wù)

  1. hive$bin/hive –-service metastore –p 8093 

//把 Spark 的相關(guān) jar 上傳到hadoophdfs指定目錄,用于指定sparkonyarn的依賴 jar

  1. spark$hadoop fs –put jars/*.jar /lib/spark2 

// 啟動 spark thriftserver 服務(wù)

  1. spark$ sbin/start-thriftserver.sh --master yarn-client --driver-memory 1G --conf  
  2. spark.yarn.jars=hdfs:///lib/spark2/*.jar 

當(dāng)hdfs 上傳了spark 依賴 jar 時,通過spark.yarn.jars 可看到日志 spark 無須每個job 都上傳jar,可節(jié)省啟動時間

  1. 19/06/1114:08:26 INFO Client: Source and destination file systems are the same. Notcopying hdfs://localhost:9000/lib/spark2/snappy-java-1.0.5.jar 
  2. 19/06/1114:08:26 INFO Client: Source and destination file systems are the same. Notcopying hdfs://localhost:9000/lib/spark2/snappy-java-1.1.7.3.jar 

//通過 spark bin 下的 beeline 工具,可以連接到 spark ThriftServer(SparkOnHive)

  1. bin/beeline -u jdbc:hive2://ip:10000/default -n hadoop 
  • -u 是指定 beeline 的執(zhí)行驅(qū)動地址;
  • -n 是指定登陸到 spark Session 上的用戶名稱;

Beeline 還支持傳入-e 可傳入一行 SQL,

  • -e query that should be executed

也可通過 –f 指定一個 SQL File,內(nèi)部可用逗號分隔的多個 SQL(存儲過程)

  • -f script file that should be executed

SparkSQL Beeline 的執(zhí)行效果展示 

基于 Spark 的數(shù)據(jù)分析實踐

SparkSQL ThriftServer 

基于 Spark 的數(shù)據(jù)分析實踐

對于 SparkSQL ThriftServer 服務(wù),每個登陸的用戶都有創(chuàng)建的 SparkSession,并且執(zhí)行的對個 SQL 會通過時間順序列表展示。

SparkSQL ThriftServer 服務(wù)可用于其他支持的數(shù)據(jù)庫工具創(chuàng)建查詢,也用于第三方的 BI 工具,如 tableau。

四、SparkSQL Flow

SparkSQL Flow 是以 SparkSQL 為基礎(chǔ),開發(fā)的統(tǒng)一的基于 XML 配置化的可執(zhí)行一連串的 SQL 操作,這一連串的 SQL 操作定義為一個 Flow。下文開始 SparkSQL Flow 的介紹:

SparkSQL Flow 是基于 SparkSQL 開發(fā)的一種基于 XML 配置化的 SQL 數(shù)據(jù)流轉(zhuǎn)處理模型。該模型簡化了 SparkSQL 、Spark RDD的開發(fā),并且降低開發(fā)了難度,適合了解數(shù)據(jù)業(yè)務(wù)但無法駕馭大數(shù)據(jù)以及 Spark 技術(shù)的開發(fā)者。

  • 一個由普元技術(shù)部提供的基于 SparkSQL 的開發(fā)模型;
  • 一個可二次定制開發(fā)的大數(shù)據(jù)開發(fā)框架,提供了靈活的可擴(kuò)展 API;
  • 一個提供了 對文件,數(shù)據(jù)庫,NoSQL 等統(tǒng)一的數(shù)據(jù)開發(fā)視界語義;
  • 基于 SQL 的開發(fā)語言和 XML 的模板配置,支持 Spark UDF 的擴(kuò)展管理;
  • 支持基于 Spark Standlone,Yarn,Mesos 資源管理平臺;
  • 支持開源、華為、星環(huán)等平臺統(tǒng)一認(rèn)證。

SparkSQL Flow 適合的場景:

  1. 批量 ETL;
  2. 非實時分析服務(wù);

SparkSQL Flow XML 概覽 

基于 Spark 的數(shù)據(jù)分析實踐
  1. Properties 內(nèi)定義一組變量,可用于宏替換;
  2. Methods 內(nèi)可注冊 udf 和 udaf 兩種函數(shù);
  3. Prepare 內(nèi)可定義前置 SQL,用于執(zhí)行 source 前的 sql 操作;
  4. Sources 內(nèi)定義一個到多個數(shù)據(jù)表視圖;
  5. Transformer 內(nèi)可定義 0 到多個基于 SQL 的數(shù)據(jù)轉(zhuǎn)換操作(支持 join);
  6. Targets 用于定義 1 到多個數(shù)據(jù)輸出;
  7. After 可定義 0到多個任務(wù)日志;

如你所見,source 的 type 參數(shù)用于區(qū)分 source 的類型,source 支持的種類直接決定SparkSQL Flow 的數(shù)據(jù)源加載廣度;并且,根據(jù) type 不同,source 也需要配置不同的參數(shù),如數(shù)據(jù)庫還需要 driver,url,user和 password 參數(shù)。

Transformer 是基于 source 定的數(shù)據(jù)視圖可執(zhí)行的一組轉(zhuǎn)換 SQL,該 SQL 符合 SparkSQL 的語法(SQL99)。Transform 的 SQL 的執(zhí)行結(jié)果被作為中間表命名為 table_name 指定的值。

Targets 為定義輸出,table_name 的值需在 source 或者 Transformer 中定義。

SparkSQL Flow 支持的Sourse 

基于 Spark 的數(shù)據(jù)分析實踐
  • 支持從 Hive 獲得數(shù)據(jù);
  • 支持文件:JSON,TextFile(CSV),ParquetFile,AvroFile
  • 支持RDBMS數(shù)據(jù)庫:PostgreSQL, MySQL,Oracle
  • 支持 NOSQL 數(shù)據(jù)庫:Hbase,MongoDB

SparkSQL Flow TextFile Source

textfile 為讀取文本文件,把文本文件每行按照 delimiter 指定的字符進(jìn)行切分,切分不夠的列使用 null 填充。

  1. <source type="textfile" table_name="et_rel_pty_cong" 
  2.  fields="cust_id,name1,gender1,age1:int"  
  3.  delimiter="," 
  4.  path="file:///Users/zhenqin/software/hive/user.txt"/> 
  1. Tablename 為該文件映射的數(shù)據(jù)表名,可理解為數(shù)據(jù)的視圖;
  2. Fields 為切分后的字段,使用逗號分隔,字段后可緊跟該字段的類型,使用冒號分隔;
  3. Delimiter 為每行的分隔符;
  4. Path 用于指定文件地址,可以是文件,也可是文件夾;
  5. Path 指定地址需要使用協(xié)議,如:file:// 、 hdfs://,否則跟 core-site.xml 配置密切相關(guān);

SparkSQL Flow DB Source

  1. <source type="mysql" table_name="et_rel_pty_cong" 
  2.  table="user" 
  3.  url="jdbc:mysql://localhost:3306/tdb?characterEncoding=UTF-8" 
  4.  driver="com.mysql.jdbc.Driver" 
  5.  user="root" password="123456"/> 

RDBMS 是從數(shù)據(jù)庫使用 JDBC讀取 數(shù)據(jù)集。支持 type 為:db、mysql、oracle、postgres、mssql;

  1. tablename 為該數(shù)據(jù)表的抽象 table 名稱(視圖);
  2. url、driver、user,password 為數(shù)據(jù)庫 JDBC 驅(qū)動信息,為必須字段;
  3. SparkSQL 會加載該表的全表數(shù)據(jù),無法使用 where 條件。

SparkSQL Flow Transformer

  1. <transform type="sql" table_name="cust_id_agmt_id_t" cached="true"
  2.  SELECT c_phone,c_type,c_num, CONCAT_VAL(cust_id) as cust_ids 
  3.  FROM user_concat_testx 
  4.  group by c_phone,c_type,c_num 
  5. </transform> 

Transform 支持 cached 屬性,默認(rèn)為 false;如果設(shè)置為 true,相當(dāng)于把該結(jié)果緩存到內(nèi)存中,緩存到內(nèi)存中的數(shù)據(jù)在后續(xù)其它 Transform 中使用能提高計算效率。但是需使用大量內(nèi)存,開發(fā)者需要評估該數(shù)據(jù)集能否放到內(nèi)存中,防止出現(xiàn) OutofMemory 的異常。

SparkSQL Flow Targets

SparkSQL Flow Targets 支持輸出數(shù)據(jù)到一個或者多個目標(biāo)。這些目標(biāo),基本覆蓋了 Source 包含的外部系統(tǒng)。下面以 Hive 舉例說明:

  1. <target type="hive" 
  2.  table_name="cust_id_agmt_id_t"  
  3.  savemode=”append” 
  4. target_table_name="cust_id_agmt_id_h"/> 
  1. table_name 為 source 或者 Transform 定義的表名稱;
  2. target_table_name 為 hive 中的表結(jié)果,Hive 表可不存在也可存在,sparksql 會根據(jù) DataFrame 的數(shù)據(jù)類型自動創(chuàng)建表;
  3. savemode 默認(rèn)為 overwrite 覆蓋寫入,當(dāng)寫入目標(biāo)已存在時刪除源表再寫入;支持 append 模式, 可增量寫入。

Target 有一個特殊的 show 類型的 target。用于直接在控制臺輸出一個 DataFrame 的結(jié)果到控制臺(print),該 target 用于開發(fā)和測試。

  1. <target type="show" table_name="cust_id_agmt_id_t" rows=”10000”/> 

Rows 用于控制輸出多少行數(shù)據(jù)。

SparkSQL Around

After 用于 Flow 在運行結(jié)束后執(zhí)行的一個環(huán)繞,用于記錄日志和寫入狀態(tài)。類似 Java 的 try {} finally{ round.execute() }

多個 round 一定會執(zhí)行,round 異常不會導(dǎo)致任務(wù)失敗。

  1. <prepare
  2.  <round type="mysql" 
  3.  sql="insert into cpic_task_history(id, task_type, catalog_model, start_time, retry_count, final_status, created_at) 
  4.  values(${uuid}, ${task.type}, ${catalog.model}, ${starttime}, 0, ${status}, now())" 
  5.  url="${jdbc.url}" .../> 
  6. </prepare
  7. <after
  8.  <round type="mysql" 
  9.  sql="update cpic_task_history set 
  10.  end_time = ${endtime}, final_status = ${status}, error_text = ${error} where id = ${uuid}" 
  11.  url="${jdbc.url}”…/> 
  12. </after

Prepare round 和 after round 配合使用可用于記錄 SparkSQL Flow 任務(wù)的運行日志。

SparkSQL Around的執(zhí)行效果 

基于 Spark 的數(shù)據(jù)分析實踐

Prepare round 可做插入(insert)動作,after round 可做更新 (update)動作,相當(dāng)于在數(shù)據(jù)庫表中從執(zhí)行開始到結(jié)束有了完整的日志記錄。SparkSQL Flow 會保證round 一定能被執(zhí)行,而且 round 的執(zhí)行不影響任務(wù)的狀態(tài)。

SparkSQL Flow 提交

  1. bin/spark-submit --master yarn-client --driver-memory 1G  
  2. --num-executors 10 --executor-memory 2G  
  3. --jars /lib/jsoup-1.11.3.jarlib/jsqlparser-0.9.6.jar,/lib/mysql-connector-java-5.1.46.jar  
  4. --conf spark.yarn.jars=hdfs:///lib/spark2/*.jar  
  5. --queue default --name FlowTest  
  6. etl-flow-0.2.0.jar -f hive-flow-test.xml 

 基于 Spark 的數(shù)據(jù)分析實踐

接收必須的參數(shù) –f,可選的參數(shù)為支持 Kerberos 認(rèn)證的租戶名稱principal,和其認(rèn)證需要的密鑰文件。

  1. usage: spark-submit --jars etl-flow.jar --class 
  2.  com.yiidata.etl.flow.source.FlowRunner 
  3.  -f,--xml-file <arg> Flow XML File Path 
  4.  --keytabFile <arg> keytab File Path(Huawei) 
  5.  --krb5File <arg> krb5 File Path(Huawei) 
  6.  --principal <arg> principal for hadoop(Huawei) 

SparkSQL Execution Plan 

基于 Spark 的數(shù)據(jù)分析實踐

每個Spark Flow 任務(wù)本質(zhì)上是一連串的 SparkSQL 操作,在 SparkUI SQL tab 里可以看到 flow 中重要的數(shù)據(jù)表操作。

regiserDataFrameAsTable 是每個 source 和 Transform 的數(shù)據(jù)在 SparkSQL 中的數(shù)據(jù)視圖,每個視圖都會在 SparkContex 中注冊一次。

對RegisterDataFrameAsTable的分析 

基于 Spark 的數(shù)據(jù)分析實踐

通過單個 regiserDataFrameAsTable 項進(jìn)行分析,SparkSQL 并不是把source 的數(shù)據(jù)立即計算把數(shù)據(jù)放到內(nèi)存,而是每次執(zhí)行 source 時只是生成了一個 Logical Plan,只有遇到需要提交的算子(Action),SparkSQL 才會觸發(fā)前面所依賴的的 plan 執(zhí)行。

總結(jié)

這是一個開發(fā)框架,不是一個成熟的產(chǎn)品,也不是一種架構(gòu)。他只是基于 SparkSQL 整合了大多數(shù)的外部系統(tǒng),能通過 XML 的模板配置完成數(shù)據(jù)開發(fā)。面向的是理解數(shù)據(jù)業(yè)務(wù)但不了解 Spark 的數(shù)據(jù)開發(fā)人員。整個框架完成了大多數(shù)的外部系統(tǒng)對接,開發(fā)者只需要使用 type 獲得數(shù)據(jù),完成數(shù)據(jù)開發(fā)后通過 target 回寫到目標(biāo)系統(tǒng)中。整個過程基本無須程序開發(fā),除非當(dāng)前的 SQL 函數(shù)無法滿足使用的情況下,需要自行開發(fā)一下特定的 UDF。因此本框架在對 SparkSQL 做了二次開發(fā)基礎(chǔ)上,大大簡化了 Spark 的開發(fā),可降低了開發(fā)者使用難度。

關(guān)于作者:震秦,普元資深開發(fā)工程師,專注于大數(shù)據(jù)開發(fā) 8 年,擅長 Hadoop 生態(tài)內(nèi)各工具的使用和優(yōu)化。參與某公關(guān)廣告(上市)公司DMP 建設(shè),負(fù)責(zé)數(shù)據(jù)分層設(shè)計和批處理,調(diào)度實現(xiàn),完成交付使用;參與國內(nèi)多省市公安社交網(wǎng)絡(luò)項目部署,負(fù)責(zé)產(chǎn)品開發(fā)(Spark 分析應(yīng)用);參與數(shù)據(jù)清洗加工為我方主題庫并部署上層應(yīng)用。

關(guān)于EAWorld:微服務(wù),DevOps,數(shù)據(jù)治理,移動架構(gòu)原創(chuàng)技術(shù)分享。

責(zé)任編輯:未麗燕 來源: 今日頭條
相關(guān)推薦

2015-10-12 17:40:12

數(shù)據(jù)分析實踐

2024-11-01 08:16:54

2018-06-15 20:44:40

Hadoop數(shù)據(jù)分析數(shù)據(jù)

2020-10-21 10:51:43

數(shù)據(jù)分析

2015-09-23 09:24:56

spark數(shù)據(jù)分析

2021-01-25 20:20:35

數(shù)據(jù)分析SparkHadoop

2014-06-30 10:59:21

2016-12-01 19:07:46

大數(shù)據(jù)數(shù)據(jù)分析

2023-03-01 18:32:16

系統(tǒng)監(jiān)控數(shù)據(jù)

2015-10-16 09:21:13

SparkMySQL數(shù)據(jù)分析

2018-02-26 08:44:35

Python微信數(shù)據(jù)分析

2017-10-11 11:10:02

Spark Strea大數(shù)據(jù)流式處理

2012-03-21 09:31:51

ibmdw

2017-01-04 10:29:37

Spark運維技術(shù)

2021-06-06 19:03:25

SQL大數(shù)據(jù)Spark

2016-10-19 18:31:11

2024-03-19 09:24:00

大數(shù)據(jù)數(shù)據(jù)分析性能優(yōu)化

2013-04-27 10:52:09

大數(shù)據(jù)全球技術(shù)峰會

2016-12-07 15:40:42

谷歌數(shù)據(jù)分析Airbnb

2018-05-23 08:39:18

AlluxioCeph對象存儲
點贊
收藏

51CTO技術(shù)棧公眾號

91av在线免费视频| 久久久久无码国产精品一区李宗瑞 | 久久久久久久久99精品大| 欧美喷潮久久久xxxxx| 国产91porn| 视频国产在线观看| 国产资源精品在线观看| 欧美一二三视频| 5566中文字幕| 日韩电影不卡一区| 欧美久久久久久久久| 国产精品无码人妻一区二区在线| 成a人v在线播放| 成人免费av在线| 国产精品视频男人的天堂| 深夜福利影院在线观看| 国产91久久精品一区二区| 欧美猛男超大videosgay| 一区二区传媒有限公司| 国产黄网站在线观看| 久久久久国产精品免费免费搜索| 亚洲一区二区日本| 波多野结衣电车| 黄色一区二区三区四区| 久久精品电影网站| 国产一区二区三区四区五区六区| 成人盗摄视频| 日韩午夜精品电影| 少妇一级淫免费播放| 综合日韩av| 五月天网站亚洲| 成年人深夜视频| 日本www在线观看| 国产亚洲美州欧州综合国| 国产精品国产三级欧美二区| 国产精品久久久久久免费免熟| 久久成人免费| 日本成人精品在线| 91国产丝袜播放在线| 在线中文一区| 美乳少妇欧美精品| 在线看的片片片免费| 凹凸成人精品亚洲精品密奴| 亚洲欧美在线免费观看| 亚洲男人在线天堂| 欧美绝顶高潮抽搐喷水合集| 亚洲第一男人天堂| 99免费观看视频| 日本一区二区三区视频在线看| 欧美日韩不卡一区二区| 老司机久久精品| 涩涩涩久久久成人精品| 欧美精品久久天天躁| 成人性生交免费看| 久久精品资源| 欧美一区二区在线视频| 久久人人爽人人片| 精品伊人久久| 欧美成人一级视频| 大尺度在线观看| 欧美黄色录像| 亚洲天堂男人天堂| 一级片久久久久| 日韩精品首页| 久久伊人91精品综合网站| www.黄色com| 天天久久综合| 欧美激情一区二区三区成人| xxxx 国产| 夜夜精品视频| 国产成人极品视频| 国产裸体美女永久免费无遮挡| 日韩av二区在线播放| 国产精品男人爽免费视频1| 一区二区三区www污污污网站| 久久成人免费网| 91热精品视频| 日韩在线观看视频一区| 久久影院午夜论| 亚洲欧美日韩国产yyy| 麻豆传媒视频在线| 亚洲国产综合在线| 成人精品小视频| 亚洲国产一区二区久久| 欧美日韩精品一二三区| 国产精品探花在线播放| 久久aimee| 一区二区三区四区精品| 久草综合在线视频| 一区二区黄色| 国产日韩欧美日韩大片| 丰满肉嫩西川结衣av| 91丨九色porny丨蝌蚪| 日日噜噜噜噜夜夜爽亚洲精品| 黄色成人影院| 色综合久久综合中文综合网| 在线视频一二区| 香蕉久久夜色精品国产更新时间| 最新91在线视频| 天天操天天射天天爽| 免费在线观看成人| 精品国产乱码久久久久久丨区2区 精品国产乱码久久久久久蜜柚 | 手机看片国产日韩| 极品尤物久久久av免费看| 国产精品久久久久久久久久三级 | 国产成人一级电影| 日产国产精品精品a∨| 亚洲国产精品精华素| 日本二三区不卡| 69xxx免费视频| 欧美大黑bbbbbbbbb在线| 91国产在线精品| av官网在线观看| 日本一区二区在线不卡| 日韩视频在线视频| 自拍偷拍亚洲| 亚洲网站视频福利| 99热在线观看免费精品| 国产精品亚洲一区二区三区妖精| 秋霞久久久久久一区二区| 啦啦啦中文在线观看日本| 欧美日韩综合色| 一级黄色片大全| 韩日欧美一区| 亚洲永久免费观看| 免费**毛片在线| 欧美亚洲日本国产| 亚洲最大成人网站| 在线精品亚洲| 高清日韩一区| 在线中文字幕-区二区三区四区| 欧美伊人久久久久久午夜久久久久| 超碰男人的天堂| 韩国久久久久| 国产成人女人毛片视频在线| 亚洲小说区图片| 日韩丝袜情趣美女图片| 日韩av手机在线免费观看| 日韩激情一区二区| 三区精品视频| 福利一区二区三区视频在线观看| 亚洲免费视频观看| 神马久久久久久久| 久久影视一区二区| 99久久久无码国产精品6| 青青久久av| 8090成年在线看片午夜| 天天操天天干天天舔| 婷婷中文字幕一区三区| 无码国产69精品久久久久网站| 欧美激情性爽国产精品17p| 亚洲最大的网站| 免费网站在线观看人| 精品处破学生在线二十三| 欧美黄片一区二区三区| 国产99久久久国产精品潘金| 香港三级日本三级a视频| 亚洲精品一二三**| 久久免费观看视频| 少妇精品视频一区二区| 精品动漫一区二区| 欧美成人午夜精品免费| 三级一区在线视频先锋| 亚洲精品欧美精品| 国产一区二区三区亚洲综合| 欧美精品在线第一页| 黄片毛片在线看| 欧美性69xxxx肥| 99久久99久久精品免费看小说.| 美国av一区二区| 亚洲国产精品女人| 99久久人爽人人添人人澡| 91国产视频在线| av黄色在线观看| 欧美一区二区三区在线电影| 国产亚洲成人av| 久久夜色精品一区| 伊人国产在线视频| 很黄很黄激情成人| 欧美18视频| www一区二区三区| 97成人精品区在线播放| 成人在线播放视频| 日韩视频免费观看高清完整版| 欧美亚韩一区二区三区| 中文字幕国产一区| 日韩大尺度视频| 日本午夜精品视频在线观看| www.一区二区.com| 国产一区二区精品福利地址| 成人字幕网zmw| 秋霞伦理一区| 久久视频精品在线| 亚洲 欧美 激情 另类| 欧美喷水一区二区| 国产精品777777| 亚洲嫩草精品久久| 色无极影院亚洲| 国产98色在线|日韩| 中文字幕国产传媒| 亚洲福利专区| 一区二区三区欧美在线| 老司机精品在线| 91精品视频免费| 91av亚洲| 欧美激情中文字幕乱码免费| 搞黄视频免费在线观看| 精品福利在线导航| 91影院在线播放| 色综合一个色综合亚洲| 久草视频免费在线播放| 欧美激情一区二区三区四区| 亚洲欧美日韩色| 国产制服丝袜一区| 91福利国产成人精品播放| 日韩一级欧洲| 四虎4hu永久免费入口| 成人一区不卡| 欧美日韩一区二| 六月丁香久久丫| 成人在线看片| 韩国一区二区三区视频| 国产精品露脸自拍| 亚洲一二三四| 久久免费视频这里只有精品| 成人短视频在线| www.亚洲男人天堂| avtt在线播放| 亚洲一区第一页| 欧美日韩在线精品一区二区三区激情综 | 精品自拍偷拍| 国产精品xxxx| 亚洲国产高清在线观看| 91视频免费在线| 亚洲欧美一级| 国产欧美一区二区三区四区| 蜜桃视频成人m3u8| 日韩av日韩在线观看| 日本不卡网站| 欧美自拍视频在线| 亚洲少妇视频| 热99在线视频| 日韩电影免费观看高清完整版| 欧美专区在线观看| 625成人欧美午夜电影| 日本久久久a级免费| 欧美成人a交片免费看| 国产精品96久久久久久又黄又硬| 欧美精品高清| 国产精品青青在线观看爽香蕉| 国产精品高清乱码在线观看 | 亚洲国产精品无码av| 亚洲午夜一区| 国产人妻777人伦精品hd| 亚洲激情综合| 免费高清在线观看免费| 可以免费看不卡的av网站| www日韩视频| 欧美bbbbb| 天堂av2020| 国产成人免费网站| 亚洲最大视频网| 97久久久精品综合88久久| 中文字幕一区二区三区人妻不卡| 国产亚洲精品久| 女教师淫辱の教室蜜臀av软件| 中文字幕亚洲成人| 少妇影院在线观看| 午夜精品福利一区二区蜜股av| 久久精品视频7| 欧美日韩免费观看一区三区| 国产乱码一区二区| 亚洲精品国产suv| 成人激情电影在线看| 久久精品视频导航| 免费看男女www网站入口在线| 欧美中文字幕视频在线观看| 99蜜月精品久久91| 亚洲最大的网站| 亚洲永久精品唐人导航网址| 亚洲精品在线观看免费| 亚洲视屏一区| 男女污污的视频| 国产剧情一区二区| 中文字幕在线免费看线人| 国产精品污污网站在线观看| 可以直接看的黄色网址| 日韩欧美成人免费视频| 97在线视频人妻无码| 日韩高清a**址| 色综合久久久久综合一本到桃花网| 欧美日韩国产123| 91在线亚洲| 国内一区在线| 午夜精品一区二区三区国产| 日韩网站在线免费观看| 毛片av一区二区| 亚洲一级av无码毛片精品| 中文字幕欧美激情一区| 国产午夜在线播放| 欧美一级理论性理论a| 九色在线视频| 久久久久久97| 亚洲黑人在线| 日本一区精品| 激情婷婷久久| 性色av浪潮av| 欧美国产精品专区| 久久国产视频播放| 日韩精品一区二区三区中文不卡 | 日韩美女毛片| 喜爱夜蒲2在线| 久久er精品视频| 久久美女免费视频| 午夜精品在线视频一区| 国产免费一区二区三区最新不卡| 亚洲人精品午夜在线观看| 激情av在线| 99国产在线视频| 我不卡神马影院| 污色网站在线观看| 久久免费视频一区| 日韩视频免费观看高清| 欧美xxx久久| 国产精品实拍| 成人欧美一区二区三区黑人孕妇| 国产最新精品| 欧美三级一级片| a亚洲天堂av| 69精品久久久| 日韩免费成人网| 影音先锋男人资源在线| 91久久国产婷婷一区二区| 色999日韩| 8x8x最新地址| 国产精品日日摸夜夜摸av| 国产成人a v| 亚洲一区二区精品| 久久久成人av毛片免费观看| 欧美日韩天天操| 老司机久久99久久精品播放免费| 51调教丨国产调教视频| 精品国产乱码久久久久酒店| 亚洲 欧美 激情 小说 另类| 97在线观看视频| 日韩手机在线| 国产一区亚洲二区三区| 91免费精品国自产拍在线不卡| 国产精品黄色网| 精品视频久久久久久久| 亚洲天堂手机| 日韩av电影免费在线观看| 久久久亚洲人| 少妇愉情理伦三级| 欧美猛男男办公室激情| av网站大全在线| 不卡一区二区三区视频| 亚洲第一黄网| 蜜桃精品一区二区| 欧美午夜精品电影| 欧美性videos| 99久久久精品免费观看国产| 亚洲久久一区二区| 久久成人激情视频| 欧美军同video69gay| 成人在线观看免费网站| 国产精品美女黄网| 丝袜诱惑制服诱惑色一区在线观看 | 久久久久久久久久久视频| 国产三级一区二区| 91亚洲欧美激情| 欧美高清在线视频观看不卡| 999久久久久久久久6666| www黄色日本| 国产精品视频一二三| 国产成人av免费看| 91精品国产91久久久久久最新| 精品国产一级毛片| 超碰中文字幕在线观看| 午夜天堂影视香蕉久久| av色图一区| 国产精品区二区三区日本| 久久精品导航| 美女的奶胸大爽爽大片| 亚洲美女性视频| 亚洲精品aa| 欧美视频在线免费播放| 国产精品区一区二区三| 亚洲精品久久久久久无码色欲四季| 日本亚洲精品在线观看| 亚洲一级淫片| 天天躁日日躁aaaxxⅹ| 在线不卡一区二区| 周于希免费高清在线观看| 一区二区三区日韩视频| 久久毛片高清国产| 亚洲av少妇一区二区在线观看| 热久久免费视频精品| 亚洲精品国产偷自在线观看| 精品人妻一区二区三区视频|