首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >修改Spark dataframe中的结构列

问修改Spark dataframe中的结构列
EN

Stack Overflow用户
提问于 2020-05-27 18:18:26
回答 3查看 3.5K关注 0票数 2

我有一个PySpark dataframe,其中包含一个列"student“,如下所示:

代码语言:javascript
复制
"student" : {
   "name" : "kaleem",
   "rollno" : "12"
}

在dataframe中,这方面的架构是:

代码语言:javascript
复制
structType(List(
   name: String, 
   rollno: String))

我需要将该列修改为

代码语言:javascript
复制
"student" : {
   "student_details" : {
         "name" : "kaleem",
         "rollno" : "12"
   }
}

在dataframe中,这方面的架构必须是:

代码语言:javascript
复制
structType(List(
  student_details: 
     structType(List(
         name: String, 
         rollno: String))
))

如何在星火中做到这一点?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-05-28 11:26:13

使用结构函数来实现这一点

1.将json读入列

代码语言:javascript
复制
val  data =
      """
        | {
        |   "student": {
        |       "name": "kaleem",
        |       "rollno": "12"
        |   }
        |}
      """.stripMargin
    val df = spark.read.json(Seq(data).toDS())
    df.show(false)
    println(df.schema("student"))

输出

代码语言:javascript
复制
+------------+
|student     |
+------------+
|[kaleem, 12]|
+------------+

StructField(student,StructType(StructField(name,StringType,true), StructField(rollno,StringType,true)),true)

named_struct 2.使用更改模式

代码语言:javascript
复制
val processedDf = df.withColumn("student",
      expr("named_struct('student_details', student)")
    )
    processedDf.show(false)
    println(processedDf.schema("student"))

输出

代码语言:javascript
复制
+--------------+
|student       |
+--------------+
|[[kaleem, 12]]|
+--------------+

StructField(student,StructType(StructField(student_details,StructType(StructField(name,StringType,true), StructField(rollno,StringType,true)),true)),false)

对于python,step#2将正常工作,只需删除val即可。

票数 2
EN

Stack Overflow用户

发布于 2020-05-27 18:50:24

有了一个名为星火帽的库--这个库扩展了Spark,并为嵌套结构和任意嵌套级别的数组中的字段转换提供了帮助。

代码语言:javascript
复制
scala> import za.co.absa.spark.hats.Extensions._

scala> df.printSchema
root
 |-- ID: string (nullable = true)

scala> val df2 = df.nestedMapColumn("ID", "ID", c => struct(c as alfa))

scala> df2.printSchema
root
 |-- ID: struct (nullable = false)
 |    |-- alfa: string (nullable = true)

scala> val df3 = df2.nestedMapColumn("ID.alfa", "ID.alfa", c => struct(c as "beta"))

scala> df3.printSchema
root
 |-- ID: struct (nullable = false)
 |    |-- alfa: struct (nullable = false)
 |    |    |-- beta: string (nullable = true)

您的查询将是

代码语言:javascript
复制
df.nestedMapColumn("student", "student", c => struct(c as "student_details"))
票数 2
EN

Stack Overflow用户

发布于 2022-07-18 05:54:54

星火3.1+

要修改结构类型列,可以使用withField和dropFields

代码语言:javascript
复制
F.col("Student").withField("student_details", F.col("student"))
F.col("Student").dropFields("name", "rollno")

输入:

代码语言:javascript
复制
from pyspark.sql import functions as F
df = spark.createDataFrame([(("kaleem", "12"),)], "student struct<name:string,rollno:string>")
df.printSchema()
# root
#  |-- student: struct (nullable = true)
#  |    |-- name: string (nullable = true)
#  |    |-- rollno: string (nullable = true)

剧本:

代码语言:javascript
复制
df = df.withColumn("student", F.col("Student")
    .withField("student_details", F.col("student"))
    .dropFields("name", "rollno")
)

结果:

代码语言:javascript
复制
df.printSchema()
# root
#  |-- student: struct (nullable = true)
#  |    |-- student_details: struct (nullable = true)
#  |    |    |-- name: string (nullable = true)
#  |    |    |-- rollno: string (nullable = true)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62050145

复制
相关文章

相似问题

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