发布
社区首页 >问答首页 >PySpark将列拆分到具有应用架构的新数据帧

PySpark将列拆分到具有应用架构的新数据帧
EN

Stack Overflow用户
提问于 2021-11-10 10:49:22
回答 1查看 53关注 0票数 1

如何通过逗号将字符串列拆分为具有应用模式的新数据帧?

作为示例,下面是一个包含两列(idvalue)的pyspark DataFrame

代码语言:javascript
代码运行次数:0
复制
df = sc.parallelize([(1, "200,201,hello"), (2, "23,24,hi")]).toDF(["id", "value"])

我希望获取value列并将其拆分到一个新的DataFrame中,并应用以下模式:

代码语言:javascript
代码运行次数:0
复制
from pyspark.sql.types import IntegerType, StringType, StructField, StructType

message_schema = StructType(
    [
        StructField("id", IntegerType()),
        StructField("value", IntegerType()),
        StructField("message", StringType()),
    ]
)

有效的方法是:

代码语言:javascript
代码运行次数:0
复制
df_split = (
    df.select(split(df.value, ",\s*"))
    .rdd.flatMap(lambda x: x)
    .toDF()
)
df_split.show()

但是我仍然需要根据模式转换和重命名列:

代码语言:javascript
代码运行次数:0
复制
df_split.select(
    [
        col(_name).cast(_schema.dataType).alias(_schema.name)
        for _name, _schema in zip(df_split.columns, message_schema)
    ]
).show()

得到了预期的结果:

代码语言:javascript
代码运行次数:0
复制
+---+-----+-------+
| id|value|message|
+---+-----+-------+
|200|  201|  hello|
| 23|   24|     hi|
+---+-----+-------+
EN

回答 1

Stack Overflow用户

发布于 2021-11-10 13:32:29

对于Spark,有一个函数from_csv,您可以使用它来解析采用3+格式的message_schema模式的逗号分隔字符串:

代码语言:javascript
代码运行次数:0
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69911928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档