检索json spark数据帧中所有键的子键值

时间:2019-06-30 08:00:39

标签: scala apache-spark scala-collections

我有一个具有如下所示架构的数据框:(我有很多键)

 |-- 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     |
+--------------------+--------------------+-------------

预先感谢

2 个答案:

答案 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 }}。