sql - PySpark 或 SQL:消耗合并
问题描述
我正在尝试将多个输入列合并为 pyspark 数据框或 sql 表中的多个输出列。
每个输出列将包含“第一个可用”输入值,然后“使用”它,因此输入值对于后续输出列不可用。
+----+-----+-----+-----+-----+-----+---+------+------+------+
| ID | in1 | in2 | in3 | in4 | in5 | / | out1 | out2 | out3 |
+----+-----+-----+-----+-----+-----+---+------+------+------+
| 1 | | | C | | | / | C | | |
| 2 | A | | C | | E | / | A | C | E |
| 3 | A | B | C | | | / | A | B | C |
| 4 | A | B | C | D | E | / | A | B | C |
| 5 | | | | | | / | | | |
| 6 | | B | | | E | / | B | E | |
| 7 | | B | | D | E | / | B | D | E |
+----+-----+-----+-----+-----+-----+---+------+------+------+
最好的方法是什么?
编辑:澄清 - in1、in2、in3 等。可以是任何值
解决方案
这是方法。
import pyspark.sql.functions as f
df = spark.read.option("header","true").option("inferSchema","true").csv("test.csv")
cols = df.columns
cols.remove('ID')
df2 = df.withColumn('ins', f.array_except(f.array(*cols), f.array(f.lit(None))))
for i in range(0, 3):
df2 = df2.withColumn('out' + str(i+1), f.col('ins')[i])
df2.show(10, False)
+---+----+----+----+----+----+---------------+----+----+----+
|ID |in1 |in2 |in3 |in4 |in5 |ins |out1|out2|out3|
+---+----+----+----+----+----+---------------+----+----+----+
|1 |null|null|C |null|null|[C] |C |null|null|
|2 |A |null|C |null|E |[A, C, E] |A |C |E |
|3 |A |B |C |null|null|[A, B, C] |A |B |C |
|4 |A |B |C |D |E |[A, B, C, D, E]|A |B |C |
|5 |null|null|null|null|null|[] |null|null|null|
|6 |null|B |null|null|E |[B, E] |B |E |null|
|7 |null|B |null|D |E |[B, D, E] |B |D |E |
+---+----+----+----+----+----+---------------+----+----+----+
推荐阅读
- swiftui - 如何使用 Realm 删除列表中的一行
- html - 如何为从烧瓶网页中的选项中选择的标签提供信息(以 html 格式)?
- android - 在 API 15 及更高版本中使用 PreferenceActivity
- .net-core - 为什么我无法访问 RunCommandLineApplicationAsync?
- php - 在 PHP Laravel 中遍历类别及其产品
- kotlin - 无法在多平台项目中使用 kotlinx.serialization
- javascript - 根据内容高度动态添加 React 元素
- operators - 关于算术右移运算符的问题
- c++ - 如何空终止作为参数传递的指针
- reactjs - 将 React / Relay 项目转换为 TypeScript — 类型导入时解析错误