split和map pysparkDataframe字段

wd2eg0qa  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(482)

我试图使用pyspark对数据进行一些操作,但我遇到了一个似乎无法解决的问题。基本上,我有两列,其中包含一个日期字符串

field1 (string): date1 date2 date3 date4 date5
field2 (string): 0.0 1.0 2.0 3.0 4.0

每个值都相互关联(因此date1与field2中的第一个值关联,date2与field2中的第二个值关联,等等)。
我想要实现的是将Dataframe转换成如下行:

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

所以我想我应该把绳子分开然后做Map

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\u map的输出?

stszievb

stszievb1#

您可以压缩数组并进行分解,再次将其选择回Dataframe。

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

相关问题