python-3.x - PySpark 将列拆分为具有应用架构的新数据框
问题描述
如何通过逗号将字符串列拆分为具有应用架构的新数据框?
例如,这是一个 pyspark DataFrame,它有两列 (id
和value
)
df = sc.parallelize([(1, "200,201,hello"), (2, "23,24,hi")]).toDF(["id", "value"])
我想获取该value
列并将其拆分为一个新的 DataFrame 并应用以下架构:
from pyspark.sql.types import IntegerType, StringType, StructField, StructType
message_schema = StructType(
[
StructField("id", IntegerType()),
StructField("value", IntegerType()),
StructField("message", StringType()),
]
)
可行的是:
df_split = (
df.select(split(df.value, ",\s*"))
.rdd.flatMap(lambda x: x)
.toDF()
)
df_split.show()
但我仍然需要根据架构转换和重命名列:
df_split.select(
[
col(_name).cast(_schema.dataType).alias(_schema.name)
for _name, _schema in zip(df_split.columns, message_schema)
]
).show()
与预期的结果:
+---+-----+-------+
| id|value|message|
+---+-----+-------+
|200| 201| hello|
| 23| 24| hi|
+---+-----+-------+
解决方案
对于 Spark 3+,有一个函数from_csv
可用于使用message_schema
DDL 格式的模式解析逗号分隔的字符串:
import pyspark.sql.functions as F
df1 = df.withColumn(
"message",
F.from_csv("value", message_schema.simpleString())
).select("message.*")
df1.show()
#+---+-----+-------+
#| id|value|message|
#+---+-----+-------+
#|200| 201| hello|
#| 23| 24| hi|
#+---+-----+-------+
df1.printSchema()
#root
# |-- id: integer (nullable = true)
# |-- value: integer (nullable = true)
# |-- message: string (nullable = true)
推荐阅读
- node.js - 找不到处理程序引用的静态文件:build/index.html -Bitbucket Pipeline React App Engine
- node.js - Heroku 无法绑定 PORT
- c++ - 反转数字中字节顺序的标准方法
- css - 将嵌套的无序列表对齐到另一个无序列表并对齐到左侧
- python - 无法将多个参数传递给 odeint 求解器
- ios - 如何在 SwiftUI 中调整 navigationBarTitle 和 Label Text 对齐方式
- visual-studio-code - 保存文件时找不到注册的语言
- c# - 在依赖注入asp.net核心的情况下,如何确保在请求结束时释放LOH等对象的内存
- google-data-studio - 是否可以使用清单来启用和禁用应用于 Google Data Studio 中表格的过滤器?
- eclipse - Jfoenix 9 和 fontawesome