【问题标题】:Retrive subkey values of all the keys in json spark dataframe检索json spark数据帧中所有键的子键值
【发布时间】:2019-11-11 09:08:24
【问题描述】:

我有一个具有如下模式的数据框:(我有大量的键)

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

提前致谢

【问题讨论】:

    标签: scala apache-spark scala-collections


    【解决方案1】:

    一个简单的选择就能解决你的问题。

    你有一个嵌套字段:

    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

    【讨论】:

    • 嗨 OBarros,我有很多我没有计数的键以及确切的键名
    • 拥有大量密钥是什么意思?你能创建一个我们可以运行的示例,或者显示一个更好地匹配问题的架构吗?
    • 我可以使用您提供的提示。这里提到的示例只有两个键(loginRequest,loginResponse)。但在我的情况下,有 100 个键,例如 loginRequest,loginResponse。我不能为每个键写这样的“var explodeDF = df.withColumn("statusRequest", df("loginRequest.responseHeader"))"。我已经尝试过这样 "df.withColumn("statusRequest", df("*. responseHeader.status")) " 但它不起作用
    • 它只是一个用json操作读取的文件。每条记录中的Json模式都不一样
    【解决方案2】:

    您可以在 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 所做的是,它按照输入列的顺序将第一个非空值传递给方法,如果没有非空值,它将返回空值(请参阅https://spark.apache.org/docs/2.3.0/api/java/org/apache/spark/sql/functions.html#coalesce-org.apache.spark.sql.Column...-)。

    【讨论】:

    • 嗨,理查德 是的,我可以做到。但最重要的是,我有大量的钥匙
    • 。这里提到的示例只有两个键(loginRequest,loginResponse)。但在我的情况下,有 100 个键,例如 loginRequest,loginResponse。我无法在合并中添加所有键。跨度>
    猜你喜欢
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 2017-07-23
    • 1970-01-01
    • 2019-08-25
    • 2021-07-18
    相关资源
    最近更新 更多