python - 拆分和映射 pyspark 数据框字段
问题描述
我正在尝试使用 pyspark 对数据进行一些操作,但我遇到了一个似乎无法解决的问题。基本上,我有 2 列包含一串日期
field1 (string): date1 date2 date3 date4 date5
field2 (string): 0.0 1.0 2.0 3.0 4.0
每个值都相互关联(因此 date1 与 field2 中的第一个值相关,date2 与 field2 中的第二个值相关,依此类推。
我想要实现的是将数据框转换为如下行:
field1 field2
date1 0.0
date2 1.0
date3 2.0
date4 3.0
date5 4.0
我试过了:
df.split(field1, ' ')
df.explode(field1)
df.split(field2, ' ')
df.explode(field2)
但这会产生一个乘法:
field1 field2
date1 0.0
date1 1.0
date1 2.0
date1 3.0
date1 4.0
date2 0.0
date2 1.0
date2 2.0
date2 3.0
date2 4.0
etc..
所以我想我应该拆分字符串然后做映射
df.split(field1, ' ')
df.split(field2, ' ')
df.create_map(field1,field2).alias(mapped_val)
df.explode(mapped_val)
但是,这不起作用,因为我收到以下错误create_map
:
TypeError: Unhasable type: list
我不确定如何让它工作,我如何将 split() 输出转换为与 create_map 一起使用的东西?
解决方案
您可以压缩数组并展开,再次将其选择回数据框。
df = spark.createDataFrame([('date1 date2 date3 date4 date5', '0.0 1.0 2.0 3.0 4.0')]).toDF('col1', 'col2')
from pyspark.sql.functions import *
df.withColumn('array', arrays_zip(split('col1', ' '), split('col2', ' '))) \
.withColumn('array', explode('array')) \
.select('array.*').toDF('col1', 'col2').show()
+-----+----+
| col1|col2|
+-----+----+
|date1| 0.0|
|date2| 1.0|
|date3| 2.0|
|date4| 3.0|
|date5| 4.0|
+-----+----+
推荐阅读
- php - 如何将 file_get_contents 与代理一起使用?
- c# - Autofac 在线路服务端的每个 DataContract 中注入 NLog 实例
- angular - Angular 5 localize-router 使用国家/语言代码设置路由
- command-line - Grunt exec - Gzip 目录中所有缩小的 css 和 js 文件
- android - 单击设备/手机的后退按钮时如何同时隐藏键盘和按钮
- c# - 与依赖项共享库
- angularjs - AngularJS $rootScope.$broadcast
- angular - 如何预选自动完成?
- performance - 一个程序如何同时为多个用户提供服务?
- javascript - angularjs 函数如何使用 angularjs 指令返回 html 代码