apache-spark - 使用pyspark将两个字符串列值连接到整数数组
问题描述
我有一个具有不同事件类型(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
解决方案
您可以使用它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|
+---------+------+------+------+-------------+
推荐阅读
- prettier - 更漂亮的原子停止工作 - 单引号错误
- python-3.x - pip 尝试安装在 requirements.txt 中被环境标记排除的包的依赖项
- html - 在源代码中查找 Instagram 图片上的替代文本
- typescript - How can I secure my domain-driven types with TypeScript?
- google-chrome-extension - chrome-extension:// in Firefox add-on
- sql-server - 当SQL SERVER中前一行的值(+ve/-ve)发生变化时,如何每次都开始一个新的行号
- csv - 在 Sublime 中仅导入部分 CSV
- javascript - JavaScript 计算属性
- postgresql - Greenplum/Postgresql Can I grant a user truncate privileges on tables start with tmp_?
- c# - 打开MySqlConnection时没有抛出异常?