使用pyspark将两个字符串列值连接到整数数组

Posted

技术标签:

【中文标题】使用pyspark将两个字符串列值连接到整数数组【英文标题】:Concatenate two string column values to array of integer using pyspark 【发布时间】:2021-06-17 10:43:54 【问题描述】:

我有一个具有不同事件类型(10、11、12)的数据框,数据因事件类型而异,我的要求是,当事件类型 = 11 时,我需要将两列数据(传感器,字段 1)连接到数组[0,1] 在传感器列中并将数据向左移动,我已经给出了我想要的输出,有没有一种方法可以使用 pyspark 实现这一点。

我能够使用 spark.sql concat() 函数进行连接,但正在寻找更通用的代码,该代码将连接列值并将其向左移动并将最后一列值分配为 NULL。

eventtype   sensor  field1  field2  eventcategory
 11           1       0     SE_500  500

预期输出:

eventtype, sensor, field1, field2, eventcategory
 11         [1,0]   SE_500   500    NULL

【问题讨论】:

【参考方案1】:

您可以使用when 来构建适当的选择。请注意,一列只能有一种类型,因此如果 eventtype != 11,则必须将传感器列转换为一个元素的数组。

import pyspark.sql.functions as F

df2 = df.select(
    'eventtype', 
    F.when(
        F.col('eventtype') == 11, 
        F.array('sensor', 'field1')
    ).otherwise(F.array('sensor')).alias('sensor'), 
    *[
        F.when(
            F.col('eventtype') == 11, 
            F.col(df.columns[i+3]) if i+3 < len(df.columns) else F.lit(None)
        ).otherwise(F.col(c)).alias(c) 
        for (i, c) in enumerate(df.columns[2:])
    ]
)

df2.show()
+---------+------+------+------+-------------+
|eventtype|sensor|field1|field2|eventcategory|
+---------+------+------+------+-------------+
|       11|[1, 0]|SE_500|   500|         null|
|       10|   [1]|     0|SE_500|          500|
+---------+------+------+------+-------------+

【讨论】:

以上是关于使用pyspark将两个字符串列值连接到整数数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在pyspark中将字符串列转换为ArrayType

将字符串列解析为 Pyspark Row

defaultdict(list) 将所有值连接到一个列表中

mongodb / mongoose mapreduce - 将所有值连接到单个数组

将字段值连接到 SQL Server 中的字符串

Kafka流:将值连接到数组中