如何通过逗号将字符串列拆分为具有应用模式的新数据帧?
作为示例,下面是一个包含两列(id
和value
)的pyspark DataFrame
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|
+---+-----+-------+
发布于 2021-11-10 05:32:29
对于Spark,有一个函数from_csv
,您可以使用它来解析采用3+格式的message_schema
模式的逗号分隔字符串:
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)
https://stackoverflow.com/questions/69911928
复制相似问题