首页 > 解决方案 > 拆分和映射 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 一起使用的东西?

标签: pythonpython-3.xapache-sparkpyspark

解决方案


您可以压缩数组并展开,再次将其选择回数据框。

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|
+-----+----+

推荐阅读