【问题标题】:split and map pyspark dataframe fields拆分和映射 pyspark 数据框字段
【发布时间】:2020-08-31 14:29:57
【问题描述】:

我正在尝试使用 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 一起工作的东西?

【问题讨论】:

    标签: python python-3.x apache-spark pyspark


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 2017-05-13
      • 2021-10-13
      相关资源
      最近更新 更多