考拉:apache spark上的pandas api
koalas的Python项目详细描述
考拉:apache spark上的pandas api
考拉项目通过在apache spark上实现pandas dataframe api,使数据科学家在与大数据交互时更有效率。
pandas是python中事实上的标准(单节点)数据帧实现,而spark是大数据处理的事实上的标准。使用此软件包,您可以:
- 如果你对熊猫已经很熟悉了,那就立即用spark提高效率,不要有学习曲线。
- 有一个单独的代码库,它既适用于pandas(测试,较小的数据集),也适用于spark(分布式数据集)。
这个项目目前处于测试阶段,并且正在快速发展,每周发布一次cadence。我们希望您尝试一下,并通过我们的邮件列表或github问题
目录
- 依赖关系
- 开始
- 文档
- 邮件列表
- 开发指南
- 设计原则
- 是蟒蛇
- 统一小数据(熊猫)api和大数据(spark)api,但熊猫优先
- 返回考拉数据结构用于大数据,熊猫数据结构用于小数据
- 为公共数据科学任务提供可发现的api" rel="nofollow">为公共数据科学任务提供可发现的api
- 提供有据可查的api和示例
- 护栏防止用户在脚中开枪
- 成为精益api层并快速移动
- 高测试覆盖率
- 常见问题
依赖关系
- cmake用于构建pyarrow
- 火花2.4.一些旧版本的spark也可以工作,但它们不受官方支持。
- 熊猫的最新版本。它是针对0.23+而正式开发的,但其他一些版本也可能工作。
- 巨蟒3.5+。
开始
考拉可以在python包索引中找到:
pip install koalas
或者使用Conda软件包管理器:
conda install koalas -c conda-forge
如果这无法安装pyarrow依赖项,您可能希望尝试使用python 3.6.x安装,因为pip install arrow
无法在3.7的开箱即用https://github.com/apache/arrow/issues/1125" rel="nofollow">https://github.com/apache/arrow/issues/1125。
如果您没有Spark环境,您还应该安装pyspark
package by:
pip install 'pyspark>=2.4'
或
conda install 'pyspark>=2.4' -c conda-forge
或下载发行版。
安装包后,您可以导入包:
importdatabricks.koalasasks
现在,您可以将pandas数据帧转换为符合api的考拉数据帧:
importpandasaspdpdf=pd.DataFrame({'x':range(3),'y':['a','b','b'],'z':['a','b','b']})# Create a Koalas DataFrame from pandas DataFramedf=ks.from_pandas(pdf)# Rename the columnsdf.columns=['x','y','z1']# Do some operations in place:df['x2']=df.x*df.x
文档
项目文档在这里发布:https://koalas.readthedocs.io
邮件列表
我们使用google groups进行邮件列表:https://groups.google.com/forum/!论坛/考拉开发
开发指南
参见贡献.md
设计原则
本节概述了考拉项目的设计原则。
是蟒蛇
考拉的目标是python数据科学家。我们希望尽可能遵守用户已经熟悉的约定。下面是一些示例:
函数名和参数使用snake_case,而不是camelcase。这与Pyspark的设计不同。例如,考拉有
to_pandas()
,而pyspark有topandas()
用于将数据帧转换为pandas数据帧。在有限的情况下,为了保持与Spark的兼容性,我们还提供Spark的变体作为别名。考拉在最大程度上尊重python数值生态系统的约定,并允许使用spark支持的numpy类型等。
考拉文档的风格和基础架构只需遵循pydata项目的其余部分即可。
统一小数据(pandas)api和大数据(spark)api,但pandas优先
考拉数据框架是为了在一个api下提供最好的pandas和spark,必要时在每个api之间进行简单而清晰的转换。当spark和熊猫有相似的api,但有细微的差异时,原则是尊重相反的api。首先是熊猫API的CT。
有不同种类的函数:
在Spark和Pandas中以相同名称找到的函数(
count
,dtypes
,head
)。返回值与p and as(而不是spark)中的返回类型相同。在spark中找到但在pandas中有明显等价物的函数,例如
alias
和rename
。这些函数将作为pandas函数的别名实现,但应将它们标记为相同函数的别名。提供它们的目的是让pyspark的现有用户无需修改代码就可以获得考拉的好处。只在熊猫身上发现的功能。当这些函数适合于分布式数据集时,它们应该在考拉中可用。
仅在SPARK中发现的对控制计算的分布式性质至关重要的函数,例如
cache
。考拉应该有这些功能。
我们仍在争论是否应该将spark中提供的数据转换函数添加到考拉中,例如select
。我们希望听到您对此的反馈。
返回大数据的考拉数据结构和小数据的熊猫数据结构
开发人员经常面临这样一个问题:一个特定的函数应该返回考拉数据帧/序列,还是熊猫数据帧/序列。原则是:如果返回的对象可以很大,那么使用考拉数据帧/序列。如果数据必须很小,请使用pandas数据帧/序列。例如,dataframe.dtypes
返回一个pandas系列,因为dataframe中的列数是有界的且很小,而dataframe.head()
或series.unique()
返回一个考拉数据帧/系列,因为生成的对象可能很大。
为常见的数据科学任务提供可发现的api
面临过度泛化的风险,有两种api设计方法:第一种方法侧重于为常见任务提供api;第二种方法从抽象开始,使用户能够通过组合原语来完成任务。虽然世界不是黑白的,但熊猫采取了更多的前一种方法,而星火采取了更多的后一种方法。
一个例子是值计数(按某个键列计数),这是数据科学中最常见的操作之一。pandasdataframe.value\count
按排序的顺序返回结果,在90%的情况下,这是用户在探索数据时喜欢的结果,而spark's不排序,这在构建数据管道时更可取,因为用户可以通过添加显式的排序方式
与熊猫类似,考拉也应该更倾向于前者,为常见的数据科学任务提供可发现的api。在大多数情况下,通过简单地实现pandas的api可以很好地处理这个原则。然而,在某些情况下,pandas的api不能满足特定的需求,例如绘制大数据。
提供有据可查的api,并提供示例
所有功能和参数都应记录在案。大多数函数都应该用示例来记录,因为这些示例比解释函数功能的一大串文本更容易理解。
建议添加文档的方法是从pyspark或pandas中相应函数的docstring开始,并对其进行修改以适应考拉。如果要添加新函数,也可以将其添加到docs/source/reference
目录中的api reference doc index页面。docstring中的示例也提高了我们的测试覆盖率。
护栏,防止用户在脚中开枪
大熊猫的某些操作在数据规模上是非常昂贵的,我们不想给用户一种错觉,即他们可以依赖考拉的这种操作。那也就是说,在考拉中实现的方法在默认情况下应该安全地在大型数据集上执行。因此,考拉没有实现以下功能:
- 基本上不可并行的功能:例如在每个元素上强制循环
- 需要在单个节点的内存中具体化整个工作集的功能。这就是为什么我们不实现
pandas.dataframe.values
。另一个例子是\u repr\u html
调用将显示的记录总数上限设置为最多1000条,以防止用户只需在笔记本中键入数据帧的名称即可炸毁其驱动程序节点。
不过,也有一些例外。"大数据科学"的一个常见模式是,虽然初始数据集很大,但随着分析的深入,工作集会变得更小。例如,数据科学家通常对数据集执行聚合,然后希望将聚合的数据集转换为某些本地数据结构。为了帮助数据科学家,我们提供以下服务:
dataframe.to_pandas()
:返回pandas数据框,仅限考拉dataframe.to_numpy()
:返回一个numpy数组,与熊猫和考拉一起工作
请注意,从名称中可以清楚地看到,这些函数返回一些本地数据结构,这些结构需要在单个节点的内存中具体化数据。对于这些函数,我们还显式地用一个警告注释来记录它们,即生成的数据结构必须很小。
成为一个精益的api层并快速移动
考拉是设计为一个API覆盖层上的火花。该项目应该是轻量级的,大多数功能应该作为spark或panda的包装器来实现。考拉不接受重量级实现,例如执行引擎更改。
这种方法使我们能够迅速行动。在相当长的将来,我们的目标是每周发布一次。如果我们发现一个严重的错误,我们将在错误修复可用时立即发布一个新版本。
高测试覆盖率
考拉应该受到很好的测试。该项目跟踪其测试覆盖率超过90%的整个代码库,并接近100%的关键部分。除非codecov报告中的语句覆盖率接近100%,否则将不接受拉取请求。
FAQ
项目进展如何?
这个项目目前处于测试阶段,并且正在快速发展。 我们计划在这个阶段每周发布一次。 您应该预料到以下差异:
某些功能可能丢失(请参见贡献部分)
有些行为可能不同,特别是在处理空的方面:熊猫使用 不是数字(NaN)表示缺少值的特殊常量,而Spark有一个 每个值上的特殊标志,指示缺少的值。我们很想听到你的消息 如果您遇到任何差异
因为spark本质上是懒惰的,所以有些操作(比如创建新列)只能 当Spark需要打印或写入数据帧时执行。
是考拉还是考拉?
是考拉。与熊猫不同,我们在这里使用大写。
我应该使用pyspark的dataframe api还是koalas?
如果您已经熟悉熊猫,并且希望利用spark获得大数据,我们建议您 使用考拉。如果您从头开始学习Spark,我们建议您从Pyspark的API开始。
如何请求对方法的支持?
文件a github问题:https://github.com/databricks/koalas/issues
欢迎databricks客户提交支持票证以请求新功能。
考拉和达斯克有何不同?
不同的项目有不同的重点。星火已经部署在几乎每一个 组织,通常是存储在数据池中的大量数据的主要接口。 考拉的灵感来源于达斯克,目的是使从熊猫到火花的转变更容易获得数据。 科学家。
我怎样才能为考拉做贡献?
参见贡献.md
为什么要创建一个新项目(而不是将其放入apache spark本身)?
两个原因:
我们需要一个能够快速迭代并发布新版本的场所。制造一个 作为一个单独的项目发布是微不足道的(按分钟的顺序)。火花释放需要 更长时间(按天数顺序)
考拉采用了一种不同的方法,这种方法可能与Spark的API设计原则相矛盾,并且 考虑到Spark的庞大用户基础,原则不能轻易改变。一个单独的新项目 为我们提供了一个尝试新设计原则的机会。
我如何在数据块上使用这个?
考拉需要databricks runtime 5.x或更高版本。对于常规databricks运行时,您可以使用集群ui上的libraries选项卡安装考拉,或者在笔记本中使用dbutils:
dbutils.library.installPyPI("koalas")dbutils.library.restartPython()
在未来,我们将在常规的databricks运行时和 用于机器学习的数据块运行时。