我有一个PySpark dataframe,其中包含一个列"student“,如下所示:
"student" : {
"name" : "kaleem",
"rollno" : "12"
}在dataframe中,这方面的架构是:
structType(List(
name: String,
rollno: String))我需要将该列修改为
"student" : {
"student_details" : {
"name" : "kaleem",
"rollno" : "12"
}
}在dataframe中,这方面的架构必须是:
structType(List(
student_details:
structType(List(
name: String,
rollno: String))
))如何在星火中做到这一点?
发布于 2020-05-28 11:26:13
使用结构函数来实现这一点
1.将json读入列
val data =
"""
| {
| "student": {
| "name": "kaleem",
| "rollno": "12"
| }
|}
""".stripMargin
val df = spark.read.json(Seq(data).toDS())
df.show(false)
println(df.schema("student"))输出
+------------+
|student |
+------------+
|[kaleem, 12]|
+------------+
StructField(student,StructType(StructField(name,StringType,true), StructField(rollno,StringType,true)),true)named_struct 2.使用更改模式
val processedDf = df.withColumn("student",
expr("named_struct('student_details', student)")
)
processedDf.show(false)
println(processedDf.schema("student"))输出
+--------------+
|student |
+--------------+
|[[kaleem, 12]]|
+--------------+
StructField(student,StructType(StructField(student_details,StructType(StructField(name,StringType,true), StructField(rollno,StringType,true)),true)),false)对于python,
step#2将正常工作,只需删除val即可。
发布于 2020-05-27 18:50:24
有了一个名为星火帽的库--这个库扩展了Spark,并为嵌套结构和任意嵌套级别的数组中的字段转换提供了帮助。
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)您的查询将是
df.nestedMapColumn("student", "student", c => struct(c as "student_details"))发布于 2022-07-18 05:54:54
星火3.1+
要修改结构类型列,可以使用withField和dropFields
F.col("Student").withField("student_details", F.col("student"))
F.col("Student").dropFields("name", "rollno")输入:
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)剧本:
df = df.withColumn("student", F.col("Student")
.withField("student_details", F.col("student"))
.dropFields("name", "rollno")
)结果:
df.printSchema()
# root
# |-- student: struct (nullable = true)
# | |-- student_details: struct (nullable = true)
# | | |-- name: string (nullable = true)
# | | |-- rollno: string (nullable = true)https://stackoverflow.com/questions/62050145
复制相似问题