python - 如何在 pyspark aws emr 中向现有数据框添加多列?
问题描述
我有这样的数据框
Row(id='123456', name='Computer Science', class='Science')
我在数据框中有 1000 行。
现在我有类似的功能
def parse_id(id):
id = somestuff
return new_id
对于每一列我都有类似的解析函数parse_name
,parse_class
我想将这些函数应用于每个数据框行,以便它提供新列new_id
,例如 'new_name'、'new_class'
所以生成的数据框会像
Row(id='123456', name='Computer Science', class='Science', new_id='12345668688', new_name='Computer Science new', new_class='Science new')
我怎样才能做到这一点
解决方案
我建议您阅读 Spark 中的 UDF 概念,因为这篇博文https://changhsinlee.com/pyspark-udf/也通过足够的示例很好地描述了这个概念。
对于您的问题,假设您的输入数据框在 variable 中df
,那么这段代码应该可以解决您的问题:
import pyspark.sql.functions as f
import pyspark.sql.types as t
parse_id_udf = f.udf(parse_id, t.StringType())
parse_name_udf = f.udf(parse_name, t.StringType())
parse_class_udf = f.udf(parse_class, t.StringType())
result_df = df.select(f.col("id"), f.col("name"), f.col("class"),
parse_id_udf(f.col("id")).alias("new_id"),
parse_name_udf(f.col("name")).alias("new_name"),
parse_class_udf(f.col("class")).alias("new_class"))
推荐阅读
- redis - 如何删除redis hashmap键的值
- android - 如何处理从firebase实时数据库中获取的大量数据?
- odoo - 基于odoo 11中的另一个选择选项减少了选择值?
- php - Laravel Spatie 无法限制 UserController
- c++ - 获取两个数组之间的差异
- android - 从 Android Jetpack 恢复到支持库
- javascript - Stripe account.create 返回 customer_id 而不是 account_id
- ruby-on-rails - 抓取嵌套参数
- python - Scikitlearn MinMax 在列或行上工作?
- java - TimescaleDB 比用于插入的普通 postgresql 10 慢