我有一个pyspark数据框,列为“学生”。
一项数据如下:
{
"Student" : {
"m" : {
"name" : {"s" : "john"},
"score": {"s" : "165"}
}
}
}
我想更改此列的架构,以便条目如下所示:
{
"Student" :
{
"m" :
{
"StudentDetails" :
{
"m" :
{
"name" : {"s" : "john"},
"score": {"s" : "165"}
}
}
}
}
}
问题是,在dataframe中student字段也可以为null。所以我想保留空值,但更改非空值的模式。我使用了一个自定义项为上述过程的工作。
def Helper_ChangeSchema(row):
#null check
if row is None:
return None
#change schema
data = row.asDict(True)
return {"m":{"StudentDetails":data}}
但udf是spark的黑匣子。是否有任何方法可以使用内置的spark函数或sql查询来执行相同的操作。
1条答案
按热度按时间91zkwejq1#
它的工作原理和这个答案一模一样。只需在结构中添加另一个嵌套级别:
作为sql表达式:
或者在使用struct函数的python代码中:
两个版本的结果相同:
对于空行,这两种方法也都适用。使用此输入数据
+---------------------+
|student |
+---------------------+
|[john], [165]|
| |
+---------------------+
processedDf = df.withColumn("student", F.when(F.col("student").isNull(), F.lit(None)).otherwise(F.struct(F.struct(F.col("student")).alias('m'))))
+---------------------+
|student |
+---------------------+
|[john], [165]|
|null |
+---------------------+