云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

轻量服务器_阿里云负载均衡_精选特惠

小七 141 0

考拉和Apache Spark之间的互操作性

考拉是一个开源项目,它提供了熊猫的替代品,能够有效地扩展到数百个工人节点,用于日常数据科学和机器学习。自去年首次推出以来,经过一年多的开发,考拉1.0发布了。pandas是数据科学家常用的Python包,但它不能扩展到大数据。当他们的数据变大时,他们必须从一开始就选择和学习另一个系统,比如apachespark,以便采用和转换现有的工作负载。其中许多都在之前的博客文章中介绍过,其中还包括与考拉合作时的最佳实践。考拉不仅对pandas用户有用,而且对PySpark用户也是有用的,因为考拉支持许多PySpark难以实现的特性。例如,Spark用户可以通过考拉绘图API直接从他们的PySpark数据框中绘制数据,类似于熊猫。PySpark DataFrame更符合SQL,而Koalas DataFrame更接近Python本身,这使得在某些上下文中使用Python更加直观。在考拉文档中,实现了各种与pandas等效的api。在这篇博文中,我们关注PySpark用户如何利用他们的知识以及PySpark和考拉之间的本机交互来更快地编写代码。我们包含了许多自包含的示例,如果安装了考拉的Spark,或者您正在使用Databricks运行时,您可以运行这些示例。从Databricks Runtime 7.1开始,考拉被打包在一起,这样您就可以在不需要手动安装的情况下运行它。考拉和Pypark数据帧在深入研究之前,让我们先看一下考拉和PySpark数据帧之间的一般区别。从外表上看,它们是不同的。考拉数据帧无缝地遵循熊猫数据帧的结构,并在引擎盖下实现索引/标识符。另一方面,PySpark数据帧往往更符合关系数据库中的关系/表,并且没有唯一的行标识符。在内部,考拉数据帧建立在PySpark数据帧上。考拉将pandas api转换成sparksql的逻辑计划。该计划由复杂而健壮的Spark SQL引擎优化和执行,Spark社区正在不断改进该引擎。考拉还遵循Spark来保持延迟求值语义,以最大限度地提高性能。为了实现pandas数据帧结构和pandas需要隐式排序的丰富api,考拉数据帧有内部元数据来表示pandas等价的索引和映射到PySpark DataFrame中列的列标签。尽管考拉利用PySpark作为执行引擎,但是与PySpark相比,您可能仍然会面临轻微的性能下降。正如在Virgin Hyperloop One的迁移体验中所讨论的,主要原因通常是:使用默认索引。构建默认索引的开销取决于数据大小、集群组成等。因此,最好避免使用默认索引。在下面的其他部分将对此进行更多讨论。PySpark和pandas中的一些api名称相同,但语义不同。例如,考拉DataFrame和PySpark DataFrame都有count API。前者统计每个列/行的非NA/null条目数,后者统计检索到的行数,包括包含null的行。>>> ks.数据帧({'a':[1,2,3],'b':[4,5,6]}).count()甲3乙3>>> spark.createDataFrame(... [[1,4],[2,5],[3,6]],模式=a,"b"])。计数()三从和到PySpark数据帧的转换对于PySpark用户来说,了解在考拉数据帧和PySpark数据帧之间来回切换以及在引擎盖下发生的事情是件好事,这样你就不必害怕进入考拉世界,在Spark上应用高度可伸缩的熊猫API。给树袋熊()导入Koalas包时,它会自动将to_Koalas()方法附加到PySpark DataFrames。您可以简单地使用此方法将PySpark数据帧转换为考拉数据帧。假设您有一个PySpark数据帧:>>>sdf=spark.createDataFrame([(1,10.0,'a'),(2,20.0,'b'),(3,30.0,'c')],模式=['x','y','z'])>>> 自卫队表演()+---+----+---+|x | y | z|+---+----+---+|1 | 10.0 | a||2 | 20.0 |乙||3 | 30.0 |摄氏度|+---+----+---+首先,导入考拉包。您通常使用ks作为包的别名。>>>进口数据库树袋熊作为ks使用上面描述的to_Koalas()方法将Spark数据帧转换为考拉数据帧。>>>kdf=去树袋熊自卫队()>>>kdf公司x y z轴0 1 10.0安12 20.0亿2 3 30.0摄氏度kdf是从PySpark数据帧创建的考拉数据帧。当实际需要数据时,计算会延迟执行,例如显示或存储计算的数据,与PySpark相同。去火花()接下来,您还应该知道如何从考拉返回PySpark数据帧。您可以对考拉数据帧使用to_spark()方法。>>>sdf_from kdf=kdf.to\u spark公司()>>>sdf_来自_kdf.秀()+---+----+---+|x | y | z|+---+----+---+|1 | 10.0 | a||2 | 20.0 |乙||3 | 30.0 |摄氏度|+---+----+---+现在又有了一个PySpark数据帧。请注意,树袋熊数据帧中不再包含索引列。下面将讨论处理以下索引的最佳实践。索引和索引列如上所示,考拉在内部管理两个列作为"索引"列,以表示熊猫的索引。"index"列用于由loc/iloc索引器访问行,或在sort_index()方法中使用而不指定排序键列,甚至用于匹配组合两个以上数据帧或序列的操作的相应行,例如df1+df2,等等。如果PySpark DataFrame中已经有这样的列,那么可以使用index_col参数来指定索引列。>>>kdf_,其中_index_col=去树袋熊自卫队(index_col='x')#或index_col=['x']>>>带索引列的kdfy z型十110.0安220.0亿3 30.0摄氏度这一次,x列不是常规列之一,而是索引。如果有多个列作为索引,则可以传递列名列表。>>> 去树袋熊自卫队(索引列=['x','y'])zx y轴110.0安220.0亿3 30.0摄氏度当返回到PySpark数据帧时,还可以使用index_col参数来保留索引列。>>>带索引的kdf__斯帕克上校(index_col='index').show()#或index_col=['index']+-----+----+---+|索引| y | z|+-----+----+---+|1 | 10.0 | a||2 | 20.0 |乙||3 | 30.0 |摄氏度|+-----+----+---+否则,索引将丢失,如下所示。>>>带索引的kdf__斯帕克上校()。显示()+----+---+|y | z|+----+---+|10.0 | a||20.0 |磅||30.0摄氏度|+----+---+列名的数目应该与索引列的数目相匹配。>>> kdf.to\u spark公司(index_col=['index1','index2']).show()回溯(最近一次呼叫):...ValueError:索引列的长度为1;但是,给定的"index"列的长度为2。默认索引如您所见,如果不指定index_col参数,则会创建一个新列作为索引。>>> 去树袋熊自卫队()x y z轴0 1 10.0安12 20.0亿2 3 30.0摄氏度专栏从哪里来?答案是"默认索引"。如果没有指定index_col参数,考拉会自动将一列作为索引附加到数据帧。默认索引有三种类型:"序列"、"分布式序列"和"分布式"。每种方法都有其独特的特点和局限性,如绩效惩罚。为了降低性能开销,在从PySpark数据帧转换时,强烈建议通过index_col指定索引列。当考拉不知道该索引的哪一列时,也会使用默认索引。例如,不带任何参数的reset_index()尝试将所有索引数据转换为常规列并重新创建索引:>>>带索引的kdf__列重置索引()x y z轴0 1 10.0安12 20.0亿2 3 30.0摄氏度您可以通过将默认索引类型设置为考拉选项来更改它。"compute.default_索引_类型":ks.set_选项('compute.default_索引_类型','顺序')或ks.options.compute公司。默认的"索引"类型="序列"序列类型"序列"类型目前在考拉中默认使用,因为它可以保证索引连续递增,就像熊猫一样。但是,它在内部使用了一个非分区窗口函数,这意味着所有数据都需要收集到一个节点中。如果节点没有足够的内存,性能将显著降低,或者发生OutOfMemoryError。>>> ks.set_选项('compute.default_索引_类型','顺序')>>> 火花射程(5) .致无尾熊()身份证件0 0112 2个3 3个4 4个分布式序列类型当使用"分布式序列"索引时,性能损失不如"序列"类型严重。它以分布式的方式计算和生成索引,但需要另一个额外的Spark作业来内部生成全局序列。它也不能保证结果的自然顺序。一般来说,它会成为一个不断增加的数字。>>> ks.set_选项('compute.default_索引_类型','分布式序列')>>> 火花射程(5) .致无尾熊()身份证件三11二4 4个0 0分散式"分布式"索引几乎没有性能损失,并且总是创建单调递增的数字。如果索引只需要作为每行的唯一编号或行的顺序,则此索引类型将是最佳选择。然而,这些数字有一个无法确定的差距。这意味着这种索引类型不太可能被用作组合两个以上数据帧或序列的操作的索引。>>> ks.set_选项('compute.default_索引_类型','分布式')>>> 火花射程(5) .致无尾熊()身份证件17179869184 034359738368 160129542144 27730941328 394489280512 4比较如您所见,每种索引类型都有其独特的特性,如下表所示。默认索引ty