在Apache中引入DataFrames引發大規模數據的科學
2015年2月17日 在工程的博客一個>
今天,我們興奮地宣布一項新的DataFrame API設計使大數據處理更簡單更廣泛的觀眾。
當我們第一次開源Apache火花,我們旨在提供一個簡單的API的分布式數據處理的通用編程語言(Java、Python、Scala)。火花使分布式數據處理通過功能轉換<一個href="//m.eheci.com/www/blog/2016/07/14/a-tale-of-three-apache-spark-apis-rdds-dataframes-and-datasets.html">分布式數據集合(抽樣)一個>。這是一個令人難以置信的強大的API:任務,用來把成千上萬行代碼來表達可以減少許多。
火花持續增長,我們希望讓更廣泛的觀眾除了“大數據”工程師利用分布式處理的力量。新的DataFrames API創建目標。這個API是受數據幀在R和Python(熊貓),但重新設計,能支持現代大數據和數據科學應用。作為一個擴展現有的抽樣API, DataFrames特點:
- 擴展能力從千字節的數據在一個筆記本在大型集群pb
- 支持多種數據格式和存儲係統
- 先進的優化和代碼生成通過火花的SQL<一個href="//m.eheci.com/www/blog/2014/03/26/spark-sql-manipulating-structured-data-using-spark-2.html">催化劑一個>優化器
- 無縫集成與所有大數據工具和基礎設施通過火花
- Python api, Java, Scala和R(在開發中通過<一個href="http://amplab-extras.github.io/SparkR-pkg/" target="_blank">SparkR一個>)
對於新用戶熟悉數據幀在其他編程語言中,這個API應該讓他們有賓至如歸的感覺。對於現有火花用戶來說,這個擴展API會讓火花容易計劃,同時提高性能通過智能優化和代碼生成。
DataFrames是什麼?
在火花,DataFrame是一個分布式數據組織成命名列的集合。概念上相當於一個表在一個關係數據庫或數據幀在R / Python,但豐富的優化。DataFrames可以由一係列廣泛的來源,例如:結構化數據文件,表在蜂巢,外部數據庫,或現有的抽樣。
下麵的例子顯示了如何在Python中構造DataFrames。類似的API是Scala和Java。
從用戶表#構造一個DataFrame蜂巢。用戶= context.table (“用戶”)#在S3中從JSON文件日誌= context.load (“s3n: / /道路/ / data.json”,“json”)
一個人怎麼能使用DataFrames嗎?
一旦建立,DataFrames提供分布式數據操作的領域特定語言。這裏有一個例子使用DataFrames操縱人口眾多的人口數據用戶:
#創建一個新DataFrame,包含“年輕的用戶”隻有年輕的=users.filter (users.age
你也可以把SQL工作時與DataFrames,使用火花SQL。這個例子數的用戶在的<我>年輕的</我>DataFrame。
young.registerTempTable (“年輕”)context.sql (從年輕”“SELECT count (*))
在Python中,您也可以之間自由轉換<一個href="//m.eheci.com/www/glossary/pandas-dataframe">熊貓DataFrame一個>和火花DataFrame:
#火花DataFrame轉換為熊貓pandas_df = young.toPandas ()#創建一個火花DataFrame熊貓spark_df = context.createDataFrame (pandas_df)
類似於抽樣,DataFrames懶洋洋地評估。也就是說,計算隻有當一個動作(如顯示結果,保存輸出)是必需的。這允許執行優化,通過應用技術,如謂詞下推和字節碼生成,後來解釋的部分“引擎蓋下麵:智能優化和代碼生成”。所有DataFrame操作也自動並行和分布式集群。
支持的數據格式和來源
現代應用程序經常需要收集和分析來自各種數據源的數據。開箱即用的,DataFrame支持從最受歡迎的讀取數據格式,包括JSON文件,檢查機關文件,蜂巢表。它可以讀取本地文件係統,分布式文件係統(<一個href="//m.eheci.com/www/glossary/hadoop-distributed-file-system-hdfs">HDFS一個>),雲存儲(S3),通過JDBC和外部關係數據庫係統。此外,通過SQL的火花<一個href="//m.eheci.com/www/blog/2015/01/09/spark-sql-data-sources-api-unified-data-access-for-the-spark-platform.html">外部數據源API一個>,DataFrames可以擴展到支持任何第三方數據格式或來源。現有第三方擴展包括Avro、CSV、<一個href="//m.eheci.com/www/glossary/elasticsearch">ElasticSearch一個>,卡桑德拉。
DataFrames”支持數據源使應用程序能夠輕鬆地組合來自不同數據源的數據(稱為聯邦數據庫係統的查詢處理)。例如,下麵的代碼片段連接一個網站的文本流量日誌存儲在S3 PostgreSQL數據庫計算每個用戶訪問網站的次數。
用戶= context.jdbc (“jdbc: postgresql:生產”,“用戶”)日誌= context.load (“/道路/ / traffic.log”)日誌。加入(用戶、日誌。用戶id = = users.userId,“left_outer”)\.groupBy (“標識”).agg ({“*”:“數”})
應用範圍:先進的分析和機器學習
數據科學家們使用日益複雜的技術,超越連接和聚合。為了支持這一點,DataFrames MLlib可以直接使用的<一個href="//m.eheci.com/www/blog/2015/01/07/ml-pipelines-a-new-high-level-api-for-mllib.html">機器學習管道API一個>。此外,程序可以運行任意複雜DataFrames用戶功能。
最常見的高級分析任務可以指定使用新的管道在MLlib API。例如,下麵的代碼創建了一個簡單的文本分類記號賦予器組成的管道,一個散列術語頻率特征提取器和邏輯回歸。
記號賦予器=記號賦予器(inputCol =“文本”outputCol =“單詞”)hashingTF = hashingTF (inputCol =“單詞”outputCol =“特征”)lr = LogisticRegression(麥克斯特=10regParam =0.01)管道=管道(階段=(記號賦予器、hashingTF lr))
一旦管道的設置中,我們可以用它來訓練DataFrame直接:
df = context.load (“/數據/道路/”)模型= pipeline.fit (df)
對於更複雜的任務超出了機器學習管道API提供了,應用程序也可以應用DataFrame任意複雜的函數,也可以操縱利用<一個href="//m.eheci.com/www/blog/2016/07/14/a-tale-of-three-apache-spark-apis-rdds-dataframes-and-datasets.html">火花的現有抽樣API一個>。以下代碼片段執行字數,大數據的“hello world”的“生物”專欄DataFrame。
df = context.load (“/道路/ / people.json”)# RDD-style方法如地圖、flatMap DataFrames上都是可用的#生物文本分割成多個單詞。話說= df.select (“生物”).flatMap (λ行:row.bio.split (”“))#創建一個新的DataFrame數單詞的數量words_df =單詞。地圖(λw:行(字= w,問=1).toDF ()word_counts = words_df.groupBy (“單詞”)。總和()
下罩:智能優化和代碼生成
與急切地評估在R和Python數據幀,在火花DataFrames執行自動優化的查詢優化器。在任何計算DataFrame開始之前,<一個href="//m.eheci.com/www/blog/2014/03/26/spark-sql-manipulating-structured-data-using-spark-2.html">催化劑優化器一個>編譯的操作被用來構建DataFrame成物理計劃執行。因為優化器了解操作的語義和結構的數據,它可以加速計算做出明智的決定。
在高級別上,有兩種類型的優化。首先,催化劑應用邏輯優化如謂詞下推。優化器可以過濾謂詞下推到數據源,使物理執行跳過無關的數據。鑲花的文件,可以跳過整個街區和比較字符串可以通過字典編碼變成整數比較便宜。在關係數據庫中,謂詞下推到外部數據庫來減少數據流量。
第二,催化劑將操作編譯為物理計劃執行並生成<一個href="//m.eheci.com/www/blog/2014/06/02/exciting-performance-improvements-on-the-horizon-for-spark-sql.html">JVM字節碼一個>對於那些計劃,往往比手寫更優化的代碼。例如,它可以選擇智能廣播之間的連接和洗牌聯接來減少網絡流量。它還可以執行低級優化,如消除昂貴的對象分配和減少虛擬函數調用。因此,我們期望性能改進現有火花項目遷移到DataFrames時。
優化器生成JVM字節碼執行以來,Python用戶將體驗相同的高性能Scala和Java用戶。
上麵的圖對比運行時性能上運行group-by-aggregation 1000萬整數對在單個機器上(<一個href="https://gist.github.com/rxin/c1592c133e4bccf515dd" target="_blank">源代碼一個>)。因為Scala和JVM字節碼編譯成Python DataFrame操作執行,這兩種語言之間幾乎沒有區別,都比香草Python抽樣變種5倍和Scala抽樣變體的2倍。
DataFrames受到以前的分布式數據幀的努力,包括Adatao的地區指定基金和Ayasdi BigDF。然而,從這些項目的主要區別是,DataFrames穿過<一個href="//m.eheci.com/www/glossary/catalyst-optimizer">催化劑優化器一個>,使優化執行類似於引發SQL查詢。我們改善催化劑優化器,發動機也變得更聰明,使應用程序更快的每個新版本的火花。
我們的數據科學團隊在磚使用這個新的DataFrame API內部數據管道。它給我們帶來了性能改進引發程序而使他們更簡潔和容易理解。我們非常興奮,認為這將使大數據處理更容易更廣泛的用戶。
這個API將於3月初火花1.3的一部分。如果你不能等待,請查看<一個href="https://github.com/apache/spark/tree/branch-1.3" target="_blank">火花從GitHub一個>試試它。如果你是在海灣地區地層會議,請加入我們<一個href="https://www.meetup.com/spark-users/events/220031485/" target="_blank">2月17日在聖何塞meetup關於這個主題一個>。
這一努力就不會數據幀實現之前,是不可能的,因此我們要感謝開發者R,熊貓、地區指定基金和BigDF為他們的工作。
嚐試DataFrames,<一個href="//m.eheci.com/www/try-databricks">得到一個免費試用的磚或使用Community Edition一個>。