精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

狠狠操狠狠干视频| 成人xxxxx| 蜜桃精品成人影片| www成人在线视频| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 亚洲欧美偷拍自拍| 亚洲第一区第二区| 欧美日韩在线成人| 2024最新电影免费在线观看 | 国产精品久久久久av福利动漫| 日韩人妻无码一区二区三区99| 久久综合欧美| 欧美成人午夜电影| 九热视频在线观看| 国产第一页在线视频| 中文字幕精品一区二区精品绿巨人| 91香蕉亚洲精品| 亚洲天堂男人av| 中文字幕亚洲综合久久五月天色无吗''| 亚洲精品乱码久久久久久按摩观| 欧美在线aaa| 老色鬼在线视频| 亚洲精选视频在线| 亚欧洲精品在线视频免费观看| 国产精品天天操| 日韩电影免费一区| 久久久亚洲精选| 天天爽天天爽天天爽| 天堂av一区二区三区在线播放| 欧美一区二区三级| 亚欧在线免费观看| 国产自产自拍视频在线观看| 亚洲色图制服诱惑| 色播亚洲视频在线观看| 亚洲欧洲精品视频| 粉嫩av一区二区三区在线播放| 国产精品高潮粉嫩av| 日韩三级视频在线| 激情久久久久久| 久久综合网hezyo| 日韩av片在线| 国内黄色精品| 日韩精品视频免费专区在线播放 | 99re在线视频免费观看| 极品av在线| 午夜电影网亚洲视频| 国产精品国三级国产av| 欧美性videos| 亚洲国产精品精华液ab| 日本一区二区三区www| 青青草av免费在线观看| 91欧美激情一区二区三区成人| 福利视频一区二区三区| 国产夫妻自拍av| 国产精品亚洲专一区二区三区 | 岳毛多又紧做起爽| 草草在线视频| 亚洲国产精品一区二区www在线| 国产在线无码精品| 在线观看免费视频你懂的| 亚洲欧洲综合另类| 日本黄色免费观看| jizz性欧美23| 欧美成人福利视频| 成人一区二区三区仙踪林| 精品成人18| 欧美一级片在线看| 亚洲成人福利视频| 中文无码日韩欧| 精品电影一区二区三区| 成人www视频在线观看| 亚洲网站在线免费观看| 精品亚洲porn| 亚洲自拍偷拍福利| 亚洲男人第一天堂| 97se亚洲国产综合在线| 欧美精品成人一区二区在线观看| 裸体xxxx视频在线| 中文av一区二区| 青青草原国产免费| 麻豆蜜桃在线| 色欲综合视频天天天| 中文字幕av专区| 日韩成人精品| 日韩成人在线电影网| 国产精品免费无码| 91精品一区二区三区综合| 欧美激情视频给我| 日韩精品一区二区亚洲av| 免费日本视频一区| 99久久99久久精品国产片| 午夜视频在线免费播放| 91免费视频网| 中文字幕久久综合| av白虎一区| 一本到一区二区三区| 亚洲综合欧美激情| 国产精品香蕉| 最近2019中文字幕一页二页 | 欧美裸体在线版观看完整版| 久久精品视频99| 国产 日韩 欧美 在线| 久久精品国内一区二区三区| 国产精品国色综合久久| 91免费在线| 亚洲不卡av一区二区三区| 男女视频在线看| 美女一区二区在线观看| 精品国产一区二区在线| 天天操天天摸天天干| 国产一区三区三区| 欧美一区二区影视| 麻豆av在线免费观看| 欧美日韩综合一区| 北岛玲一区二区| 午夜视频一区| 国产欧美日韩视频| 飘雪影院手机免费高清版在线观看| 亚洲天堂精品在线观看| 男人透女人免费视频| aaa国产精品视频| 久久精品国产成人| 免费在线观看av的网站| 99精品桃花视频在线观看| 亚洲精品偷拍视频| 91国拍精品国产粉嫩亚洲一区| 亚洲国产欧美精品| 激情五月婷婷小说| 精品一区二区免费视频| 日本日本精品二区免费| mm视频在线视频| 日韩美女一区二区三区四区| 亚洲国产精品一区二区久久hs| 久久久亚洲一区| 精品国产免费久久久久久尖叫| av电影免费在线观看| 欧美日韩精品一区二区天天拍小说| 日本高清www| 亚洲影院免费| 久久五月天婷婷| 性欧美18xxxhd| 日韩av网站电影| wwwwww国产| 2019国产精品| 一本大道熟女人妻中文字幕在线 | 日本一区二区三区视频在线播放| 国产福利电影在线播放| 亚洲第一av网| 天堂网一区二区三区| 99久久国产综合精品麻豆| 男人天堂手机在线视频| 99精品国产高清一区二区麻豆| 欧美另类精品xxxx孕妇| 国产高清在线观看视频| 亚洲人123区| 色哟哟免费视频| 欧美日韩岛国| 国产精品免费一区二区三区观看 | 成年人视频在线观看免费| 色妹子一区二区| 99精品全国免费观看| 另类综合日韩欧美亚洲| 国产精品无码乱伦| 涩爱av色老久久精品偷偷鲁 | 无码人妻丰满熟妇奶水区码| 久久久久久久国产精品影院| 天堂av在线网站| 91久久高清国语自产拍| 亚洲最大的网站| 国产精品69xx| 国产亚洲精品久久| 一卡二卡三卡在线| 一区二区久久久久| 国产真实乱人偷精品| 久久激情久久| 爱爱爱视频网站| 红杏aⅴ成人免费视频| 97视频免费观看| h视频在线免费| 日韩一区二区三区在线| 欧美不卡视频在线观看| 国产免费久久精品| gogo亚洲国模私拍人体| 亚洲永久在线| 国产精品波多野结衣| 狠狠久久伊人| 成人日韩av在线| 国产直播在线| 久久躁日日躁aaaaxxxx| 日本免费一区视频| 欧美日韩电影在线| 一区二区三区视频免费看| 成人欧美一区二区三区小说 | 黄色永久免费网站| 欧美私人啪啪vps| 欧美日韩综合久久| 日韩精品一区二区三区中文字幕| 91精品国产高清自在线看超| 黄色网址中文字幕| 亚洲日本va午夜在线影院| aaaa黄色片| 久久国产精品第一页| 久色视频在线播放| 91精品一区国产高清在线gif| 久久精彩视频| 久久免费电影| 国产亚洲精品久久久| 成人免费一级视频| 欧美日韩美女一区二区| av大片在线免费观看| 一区二区三区精密机械公司| 国产美女永久免费无遮挡| 床上的激情91.| 色一情一区二区| 久久午夜视频| 欧美一级视频在线播放| 91亚洲国产高清| 日本一区二区高清视频| 欧美1区2区3区4区| 51精品国产人成在线观看| 成人18视频在线观看| 欧美伊久线香蕉线新在线| 日本成人不卡| 久久国产色av| 日韩在线资源| 在线精品国产欧美| 日韩av成人| 亚洲成人动漫在线播放| 国产黄色免费大片| 欧美一区二区不卡视频| 国产一区二区波多野结衣| 欧美亚洲综合久久| 免费黄色片视频| 色妞www精品视频| 无码人妻久久一区二区三区不卡| 午夜精品久久一牛影视| 国产一二三四在线| 亚洲综合久久av| 国产第100页| 亚洲国产视频网站| 精品在线免费观看视频| 亚洲一区二区三区自拍| 久久午夜无码鲁丝片午夜精品| 亚洲精选视频在线| 久久黄色小视频| 亚洲一区二区三区爽爽爽爽爽| 欧美精品乱码视频一二专区| 亚洲激情六月丁香| 青青草激情视频| 亚洲一区在线观看免费观看电影高清| 中文字幕在线观看成人| 亚洲综合成人在线视频| 国产午夜视频在线播放| 亚洲成在线观看| 国产三级av片| 欧美亚洲一区二区在线观看| 亚洲视频在线观看一区二区| 777久久久精品| 亚洲精品第五页| 亚洲国产精品美女| 男人的天堂在线| 正在播放亚洲1区| 日本在线免费播放| 欧美成人精品一区| 2021天堂中文幕一二区在线观| 8x拔播拔播x8国产精品| 欧美性猛交xxx高清大费中文| 国产精品美女www爽爽爽视频| 成人精品国产亚洲| 亚洲a级在线播放观看| a看欧美黄色女同性恋| 九九久久99| 日本不卡电影| 国产激情片在线观看| 国产精品婷婷| 亚洲欧美久久久久| 国产91露脸合集magnet| 久久精品国产亚洲av麻豆| 国产精品久久一级| 妺妺窝人体色www在线下载| 懂色av一区二区三区| 亚洲无码精品在线观看| 欧美成人一级视频| 好男人免费精品视频| 久久亚洲国产精品| 色在线中文字幕| 国产在线视频91| 久久a爱视频| 亚洲精品国产精品国自产| 国产专区一区| 99热手机在线| 成人午夜电影小说| 五月婷婷婷婷婷| 偷窥少妇高潮呻吟av久久免费| 中文字幕 日韩有码| 精品久久一二三区| 91精彩视频在线播放| 午夜精品久久久久久久99黑人| 精品久久在线| 久久99精品国产99久久| 亚洲精品一区二区妖精| 国产xxxxx在线观看| 国产成人亚洲综合a∨婷婷图片| 成人精品999| 亚洲成人精品在线观看| 国产又大又长又粗| 亚洲精品影视在线观看| 黑人玩欧美人三根一起进| 国产精品一区二区三区免费视频| 欧美理论电影在线精品| 国产成人生活片| 久久99热这里只有精品| 国内精品久久99人妻无码| 一区二区久久久久| 国产免费高清av| 中文字幕亚洲无线码在线一区| 新版的欧美在线视频| 国产chinese精品一区二区| 婷婷亚洲五月色综合| 国产天堂在线播放| 99久久久免费精品国产一区二区| 国产美女福利视频| 欧美影视一区二区三区| 黄视频在线播放| 2019中文字幕在线| 国产精品超碰| 国产一二三区在线播放| 国产一区二区不卡| 欧美一级片在线视频| 欧美日韩一二三区| 国产精品四虎| 国产成人欧美在线观看| 亚洲欧美校园春色| 1024av视频| 99精品热视频| 日本一级一片免费视频| 亚洲第一在线视频| 波多野结衣在线观看| 成人黄色片视频网站| 欧美a级在线| 国产人妖在线观看| 亚洲一区二区免费视频| 亚洲精品久久久久久久久久 | 午夜剧场免费在线观看| 欧美精品久久99| 免费a级在线播放| 91久久久久久| 欧美激情综合色综合啪啪| 亚洲天堂小视频| 亚洲国产精品一区二区www在线| 蜜桃久久一区二区三区| 97国产精品久久| 亚洲精品进入| 一区二区三区入口| 国产精品久久久久久久久免费樱桃| 在线观看免费视频a| 久久精品国产久精国产思思| 国产精品99久久免费| 欧美大片免费播放| 成人一区二区三区视频在线观看| 日韩欧美亚洲国产| 亚洲欧美另类人妖| yy6080久久伦理一区二区| 手机看片日韩国产| 成人av网址在线观看| 四虎精品永久在线| 在线观看视频99| 中文字幕日韩高清在线| 精品国产免费av| 国产精品免费视频一区| www.亚洲天堂.com| 午夜精品理论片| 精品一区电影| 岛国大片在线免费观看| 欧美日韩亚洲精品内裤| 番号集在线观看| 产国精品偷在线| 日韩在线a电影| 少妇人妻丰满做爰xxx| 亚洲国产一区二区三区四区| 青青青免费在线视频| 亚洲人成77777| 成人国产亚洲欧美成人综合网| aaaaaa毛片| 另类图片亚洲另类| 少妇精品导航| 福利视频999| 精品国产乱码久久久久久天美| 91社区在线| 久久久久久久久久久久久久久久av| 秋霞午夜鲁丝一区二区老狼| 91成人福利视频| 亚洲色图在线观看| av成人男女| 国产aⅴ爽av久久久久| 欧美视频中文字幕在线| v片在线观看| 五月天亚洲综合| 91小视频在线观看| 国产av无码专区亚洲av麻豆|