我有一个具有如下所示架构的数据框:(我有很多键)
|-- loginRequest: struct (nullable = true)
| |-- responseHeader: struct (nullable = true)
| | |-- status: long (nullable = true)
| | |-- code: long (nullable = true)
|-- loginResponse: struct (nullable = true)
| |-- responseHeader: struct (nullable = true)
| | |-- status: long (nullable = true)
| | |-- code: long (nullable = true)
我想创建一个列,其状态为responseHeader.status的所有键
预期
+--------------------+--------------------+------------+
| loginRequest| loginResponse| status |
+--------------------+--------------------+------------+
|[0,1] | null| 0 |
| null|[0,1] | 0 |
| null| [0,1]| 0 |
| null| [1,0]| 1 |
+--------------------+--------------------+-------------
预先感谢
答案 0 :(得分:0)
一个简单的选择将解决您的问题。
您有一个嵌套字段:
loginResponse: struct (nullable = true)
| |-- responseHeader: struct (nullable = true)
| | |-- status
一种快速的方法是展平数据框。
做这样的事情:
df.select(df.col("loginRequest.*"),df.col("loginResponse.*"))
从那里开始工作:
或者,
您可以使用类似这样的内容:
var explodeDF = df.withColumn("statusRequest", df("loginRequest. responseHeader"))
您帮助我解决了以下问题:
为了使其能够从响应或请求中进行填充,可以在spark中使用when
条件。
-How to use AND or OR condition in when in Spark
答案 1 :(得分:0)
您可以在select语句中使用.
分隔符来获得子字段,并借助coalesce
方法,您应该确切地得到了目标,即,我们将其称为输入数据框df
使用您指定的输入模式,那么这段代码就可以完成工作:
import org.apache.spark.sql.functions.{coalesce, col}
val df_status = df.withColumn("status",
coalesce(
col("loginRequest.responseHeader.status"),
col("loginResponse.responseHeader.status")
)
)
coalesce
的作用是,它按照方法的输入列的顺序获取第一个非空值,并且在不存在非空值的情况下,它将返回空值(请参阅{{3 }}。