热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

dataframe添加一列_在PySpark数据框中添加新列的5种方法

每天都在生成太多数据。尽管有时我们可以使用Rapids或Parallelization等工具来管理大数据,但如果您使用的是TB级数据,Spark是一个很

c5ea66f3cac895a9b1e333869da97714.png

每天都在生成太多数据。尽管有时我们可以使用Rapids或Parallelization等工具来管理大数据,但如果您使用的是TB级数据,Spark是一个很好的工具。尽管这篇文章解释了如何使用RDD和基本的Dataframe操作,但是我在使用PySpark Dataframes时错过了很多东西。只有当我需要更多功能时,我才阅读并提出多种解决方案来做一件事情。如何在Spark中创建新列?现在,这听起来微不足道,但请相信我,事实并非如此。您可能想要处理这么多数据,所以我很确定您最终将在工作流中使用大多数这些列创建过程。有时使用Pandas功能,有时使用基于RDD的分区,有时使用成熟的python生态系统。这篇文章将是关于"在Pyspark Dataframe中创建新列的多种方法"。如果您安装了PySpark,则可以跳过下面的"入门"部分。Spark入门我知道很多人不会在系统中安装Spark来尝试和学习。但是安装Spark本身就是一件令人头疼的事情。由于我们想了解它是如何工作的以及如何使用它,因此建议您在此处与社区版一起在线使用Databricks上的Spark。不用担心,它是免费的,尽管资源较少,但是对于我们来说,出于学习目的,它现在就适用。

9f3b4fdcd6209517666cce5bec3e6286.png

一旦注册并登录,将显示以下屏幕。

4e367d1c6dc499e7750d88ac9050b45c.png

您可以在此处启动新笔记本。选择Python笔记本,并为笔记本命名。启动新笔记本并尝试执行任何命令后,笔记本将询问您是否要启动新群集。做吧下一步将检查sparkcontext是否存在。要检查sparkcontext是否存在,您必须运行以下命令:sc

8ca4445bc6eac68cd33206b25609ea2b.png

这意味着我们已经设置了可以运行Spark的笔记本。

数据在这里,我将处理Movielens ml-100k.zip数据集。1000位用户观看1700部电影时获得100,000个评分。在此压缩文件夹中,我们将专门使用的文件是评估文件。该文件名保留为" u.data"如果要上载此数据或任何数据,可以单击左侧的"数据"选项卡,然后使用提供的GUI添加数据。

262c4da761365a05c22bdca643d5659b.png

然后,我们可以使用以下命令加载数据:

ratings = spark.read.load("/FileStore/tables/u.data",format="csv", sep="\t", inferSchema="true", header="false")ratings = ratings.toDF(*['user_id', 'movie_id', 'rating', 'unix_timestamp'])外观如下:

ratings.show()

cc07af946e1182fce92a1074aba222b4.png

好的,现在我们准备开始我们感兴趣的部分。如何在PySpark Dataframe中创建一个新列?

使用Spark本机函数在PySpark DataFrame中创建新列的最pysparkish方法是使用内置函数。这是创建新列的最高效的编程方式,因此,这是我想进行某些列操作时首先要去的地方。我们可以将.withcolumn与PySpark SQL函数一起使用来创建新列。本质上,您可以找到已经使用Spark函数实现的String函数,Date函数和Math函数。我们可以将spark函数导入为:

import pyspark.sql.functions as F我们的第一个函数F.col函数使我们可以访问列。因此,如果我们想将一栏乘以2,可以将F.col用作:

ratings_with_scale10 = ratings.withColumn("ScaledRating", 2*F.col("rating"))ratings_with_scale10.show()

812ed54dc2c470da4674db84e360790e.png

我们还可以使用数学函数,例如F.exp函数:

ratings_with_exp = ratings.withColumn("expRating", 2*F.exp("rating"))ratings_with_exp.show()

c970864c65576fa02280d1124eec2356.png

此模块中提供了许多其他功能,足以满足大多数简单的用例。您可以在此处查看功能列表。

Spark UDF有时我们想对一列或多列做复杂的事情。可以将其视为对PySpark数据框到单列或多列的映射操作。尽管Spark SQL函数确实解决了许多有关创建列的用例,但只要我想使用更成熟的Python功能时,我都会使用Spark UDF。要使用Spark UDF,我们需要使用F.udf函数将常规的python函数转换为Spark UDF。我们还需要指定函数的返回类型。在此示例中,返回类型为StringType()

import pyspark.sql.functions as Ffrom pyspark.sql.types import *defsomefunc(value): if value <3: return &#39;low&#39; else: return &#39;high&#39;#convert to a UDF Function by passing in the function and return type of function udfsomefunc &#61; F.udf(somefunc, StringType())ratings_with_high_low &#61; ratings.withColumn("high_low", udfsomefunc("rating"))ratings_with_high_low.show()

e9b4fd96f8e2809c73d753fcc4b707a8.png

使用RDD有时&#xff0c;Spark UDF和SQL函数对于特定用例而言都是不够的。您可能想利用Spark RDD获得的更好的分区。或者&#xff0c;您可能想在Spark RDD中使用组函数。您可以使用此方法&#xff0c;主要是在需要访问python函数内部spark数据框中的所有列时。无论如何&#xff0c;我发现使用RDD创建新列的这种方式对于有经验的RDD(这是Spark生态系统的基本组成部分)的人们非常有用。下面的过程利用该功能在Row和pythondict对象之间进行转换。我们将行对象转换为字典。按照我们的习惯使用字典&#xff0c;然后将该字典再次转换回行。

import mathfrom pyspark.sql import Rowdefrowwise_function(row): # convert row to dict: row_dict &#61; row.asDict() # Add a new key in the dictionary with the new column name and value. row_dict[&#39;Newcol&#39;] &#61; math.exp(row_dict[&#39;rating&#39;]) # convert dict to row: newrow &#61; Row(**row_dict) # return new row return newrow# convert ratings dataframe to RDDratings_rdd &#61; ratings.rdd# apply our function to RDDratings_rdd_new &#61; ratings_rdd.map(lambda row: rowwise_function(row))# Convert RDD Back to DataFrameratings_new_df &#61; sqlContext.createDataFrame(ratings_rdd_new)ratings_new_df.show()

8de7f9a1cb046cd8cac9ffa2dd1b9bfe.png

Pandas UDFSpark版本2.3.1中引入了此功能。这使您可以在Spark中使用Pands功能。我通常在需要在Spark数据帧上运行groupby操作或需要创建滚动功能并想使用Pandas滚动功能/窗口功能的情况下使用它。我们使用它的方式是使用F.pandas_udf装饰器。我们在这里假设该函数的输入将是一个熊猫数据框。我们需要从该函数依次返回一个Pandas数据框。这里唯一的复杂性是我们必须为输出数据框提供一个架构。我们可以使用以下格式来实现。

# Declare the schema for the output of our functionoutSchema &#61; StructType([StructField(&#39;user_id&#39;,IntegerType(),True),StructField(&#39;movie_id&#39;,IntegerType(),True),StructField(&#39;rating&#39;,IntegerType(),True),StructField(&#39;unix_timestamp&#39;,IntegerType(),True),StructField(&#39;normalized_rating&#39;,DoubleType(),True)])# decorate our function with pandas_udf decorator&#64;F.pandas_udf(outSchema, F.PandasUDFType.GROUPED_MAP)defsubtract_mean(pdf): # pdf is a pandas.DataFrame v &#61; pdf.rating v &#61; v - v.mean() pdf[&#39;normalized_rating&#39;] &#61;v return pdfrating_groupwise_normalization &#61; ratings.groupby("movie_id").apply(subtract_mean)rating_groupwise_normalization.show()

e2c58c3c2ad4f51837397fd23b1be823.png

我们还可以利用它在每个火花节点上训练多个单独的模型。为此&#xff0c;我们复制数据并为每个复制提供一个键和一些训练参数&#xff0c;例如max_depth等。然后&#xff0c;我们的函数将使用熊猫Dataframe&#xff0c;运行所需的模型&#xff0c;然后返回结果。结构如下所示。

# 0. Declare the schema for the output of our functionoutSchema &#61; StructType([StructField(&#39;replication_id&#39;,IntegerType(),True),StructField(&#39;RMSE&#39;,DoubleType(),True)])# decorate our function with pandas_udf decorator&#64;F.pandas_udf(outSchema, F.PandasUDFType.GROUPED_MAP)defrun_model(pdf): # 1. Get hyperparam values num_trees &#61; pdf.num_trees.values[0] depth &#61; pdf.depth.values[0] replication_id &#61; pdf.replication_id.values[0] # 2. Train test split Xtrain,Xcv,ytrain,ycv &#61; train_test_split..... # 3. Create model using the pandas dataframe clf &#61; RandomForestRegressor(max_depth &#61; depth, num_trees&#61;num_trees,....) clf.fit(Xtrain,ytrain) # 4. Evaluate the model rmse &#61; RMSE(clf.predict(Xcv,ycv) # 5. return results as pandas DF res &#61;pd.DataFrame({&#39;replication_id&#39;:replication_id,&#39;RMSE&#39;:rmse}) return resresults &#61; replicated_data.groupby("replication_id").apply(run_model)以上只是一个想法&#xff0c;而不是一个有效的代码。尽管应该稍作修改。

使用SQL对于喜欢SQL的人&#xff0c;甚至可以使用SQL创建列。为此&#xff0c;我们需要注册一个临时SQL表&#xff0c;然后使用带有附加列的简单选择查询。一个人也可以用它来进行联接。

ratings.registerTempTable(&#39;ratings_table&#39;)newDF &#61; sqlContext.sql(&#39;select *, 2*rating as newCol from ratings_table&#39;)newDF.show()

116d1348213fc6fe4092b2588a1c49c4.png

希望我已经很好地介绍了列创建过程&#xff0c;以帮助您解决Spark问题。

- END -

文源网络&#xff0c;仅供学习之用&#xff0c;如有侵权&#xff0c;联系删除。往期精彩

ed16a11e6244807d4fce86da5af0b052.png

◆  50款开源工具你都用过吗&#xff1f;

◆  python&#43;C、C&#43;&#43;混合编程的应用

◆  python网络爬虫的基本原理详解

◆  Python自动操控excel&#xff0c;一小时解决你一天的工作

◆  如何用Python增强Excel&#xff0c;减少处理复杂数据的痛苦&#xff1f;

2c0fe903de232fcff6aa765e5671400d.png




推荐阅读
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 本文介绍了Android中的assets目录和raw目录的共同点和区别,包括获取资源的方法、目录结构的限制以及列出资源的能力。同时,还解释了raw目录中资源文件生成的ID,并说明了这些目录的使用方法。 ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
author-avatar
请叫我浪漫先生_858
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有