我正在处理类似于以下内容的DynamoDB JSON:
{
"name" : {"S" : "John"},
"birthday": {
"M" : {
"month" : {"N": 1},
"year" : {"N": 2000},
"day" : {"N": 2}
}
}
}
当我在spark 中读到这篇文章时
val df = spark.read.json("s3://path")
我得到了一个复杂的模式:
name : structType ( S : String),
birthday: structType (
M : StructType (
month : structType (N : int),
year : structType (N : int),
day : structType (N : int),
)
)
相反,我想将模式更改为类似的模式
name : String
birthday : structType (
month : int
year : int
day : int
)
有办法做到这一点吗?
事实上,我的模式比这个例子大得多,有许多嵌套很深的结构。我还想知道是否存在动态的";归一化";架构。
.selectExpr("name", "birthday.M as birthday")
或者你甚至可以把它完全压平到根级别的
.selectExpr("name", "birthday.M.*")
我能够使用named_struct
函数:
df.selectExpr("""
named_struct (
'name', name.S,
'birthday', named_struct(
'month', birthday.M.month.N as decimal,
'year', birthday.M.year.N as decimal,
'day', birthday.M.day.N as decimal,
)
) as items
""")
这对我来说效果很好。