在Apache中引入DataFrames引发大规模数据的科学
2015年2月17日 在工程的博客一个>
今天,我们兴奋地宣布一项新的DataFrame API设计使大数据处理更简单更广泛的观众。
当我们第一次开源Apachebob下载地址火花,我们旨在提供一个简单的API的分布式数据处理的通用编程语言(Java、Python、Scala)。火花使分布式数据处理通过功能转换<一个href="//www.neidfyre.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="//www.neidfyre.com/www/blog/2014/03/26/spark-sql-manipulating-structured-data-using-spark-2.html">催化剂一个>优化器
- 无缝集成与所有大数据工具和基础设施通过火花
- Python api, Java, Scala和R(在开发中通过<一个href="https://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(“年轻的”)上下文。sql (“SELECT count(*)从年轻”)
在Python中,您也可以之间自由转换<一个href="//www.neidfyre.com/www/glossary/pandas-dataframe">熊猫DataFrame一个>和火花DataFrame:
#火花DataFrame转换为熊猫pandas_df = young.toPandas ()#创建一个火花DataFrame熊猫spark_df = context.createDataFrame (pandas_df)
类似于抽样,DataFrames懒洋洋地评估。也就是说,计算只有当一个动作(如显示结果,保存输出)是必需的。这允许执行优化,通过应用技术,如谓词下推和字节码生成,后来解释的部分“引擎盖下面:智能优化和代码生成”。所有DataFrame操作也自动并行和分布式集群。
支持的数据格式和来源
现代应用程序经常需要收集和分析来自各种数据源的数据。开箱即用的,DataFrame支持从最受欢迎的读取数据格式,包括JSON文件,检查机关文件,蜂巢表。它可以读取本地文件系统,分布式文件系统(<一个href="//www.neidfyre.com/www/glossary/hadoop-distributed-file-system-hdfs">HDFS一个>),云存储(S3),通过JDBC和外部关系数据库系统。此外,通过SQL的火花<一个href="//www.neidfyre.com/www/blog/2015/01/09/spark-sql-data-sources-api-unified-data-access-for-the-spark-platform.html">外部数据源API一个>,DataFrames可以扩展到支持任何第三方数据格式或来源。现有第三方扩展包括Avro、CSV、<一个href="//www.neidfyre.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="//www.neidfyre.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="//www.neidfyre.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="//www.neidfyre.com/www/blog/2014/03/26/spark-sql-manipulating-structured-data-using-spark-2.html">催化剂优化器一个>编译的操作被用来构建DataFrame成物理计划执行。因为优化器了解操作的语义和结构的数据,它可以加速计算做出明智的决定。
在高级别上,有两种类型的优化。首先,催化剂应用逻辑优化如谓词下推。优化器可以过滤谓词下推到数据源,使物理执行跳过无关的数据。镶花的文件,可以跳过整个街区和比较字符串可以通过字典编码变成整数比较便宜。在关系数据库中,谓词下推到外部数据库来减少数据流量。
第二,催化剂将操作编译为物理计划执行并生成<一个href="//www.neidfyre.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="//www.neidfyre.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="//www.neidfyre.com/www/try-databricks">得到一个免费试用的砖或使用Community Edition一个>。