Spark:如何使用Struct数组列表解析多个json?

用户名

我正在尝试获取文件中所有JSON对象的平均评级。我加载了文件并转换为数据帧,但在解析avg时却出错。样品要求:

{
        "country": "France",
        "customerId": "France001",
        "visited": [
            {
                "placeName": "US",
                "rating": "2.3",
                "famousRest": "N/A",
                "placeId": "AVBS34"

            },
              {
                "placeName": "US",
                "rating": "3.3",
                "famousRest": "SeriousPie",
                "placeId": "VBSs34"

            },
              {
                "placeName": "Canada",
                "rating": "4.3",
                "famousRest": "TimHortons",
                "placeId": "AVBv4d"

            }        
    ]
}

因此对于此JSON,美国平均评分为(2.3 + 3.3)/ 2 = 2.8

{
        "country": "Egypt",
        "customerId": "Egypt009",
        "visited": [
            {
                "placeName": "US",
                "rating": "1.3",
                "famousRest": "McDonald",
                "placeId": "Dedcf3"

            },
              {
                "placeName": "US",
                "rating": "3.3",
                "famousRest": "EagleNest",
                "placeId": "CDfet3"

            },


}

{
        "country": "Canada",
        "customerId": "Canada012",
        "visited": [
            {
                "placeName": "UK",
                "rating": "3.3",
                "famousRest": "N/A",
                "placeId": "XSdce2"

            },


    ]
}

对于我们这个平均值=(3.3 +1.3)/ 2 = 2.3

因此,总体而言,平均评分将为:(2.8 + 2.3)/ 2 = 2.55(只有两个请求的访问列表中有“ US”)

我的架构:

root
|-- country: string(nullable=true)
|-- customerId:string(nullable=true)
|-- visited: array (nullable = true)
|    |-- element: struct (containsNull = true)
|    |   |-- placeId: string (nullable = true)
|    |   |-- placeName: string (nullable = true) 
|    |   |-- famousRest: string (nullable = true)
|    |   |-- rating: string (nullable = true)

val sqlContext = new org.apache.spark.sql.SQLContext(sc)
val df = sqlContext.jsonFile("temp.txt")
df.show() 

因此,基本上,我需要获取例如placeName ='US'的评分的平均值。AVG_RATING =每个JSON对象中的评分总和,其中placeName是US /这样的访问条目的计数,而FINAL_VALUE =每个JSON对象中所有具有placeName'US'的AVG_RATING的总和/所有JSON对象的placeName ='US'的计数。

到目前为止,我尝试了:

 df.registerTempTable("people")
   sqlContext.sql("select avg(expResults.rank) from people LATERAL VIEW explode(visited)people AS expResults where expResults.placeName = 'US' ").collect().foreach(println)

    val result = df.select("*").where(array_contains (df("visited.placeName"), "US"));  - gives the list where visited array contains US. But I am not sure how do parse through list of structs.

有人可以告诉我该怎么做吗?

零323

您似乎想要这样的东西:

import org.apache.spark.sql.functions.{avg, explode}

val result = df
  .withColumn("visit", explode($"visited"))    // Explode visits
  .groupBy($"customerId", $"visit.placeName")  // Group by using dot syntax
  .agg(avg($"visit.rating".cast("double")).alias("tmp"))
  .groupBy($"placeName").agg(avg($"tmp").alias("value"))

之后,您可以针对您选择的国家/地区进行过滤。

result.where($"placeName" === "US").show
// +---------+-----+
// |placeName|value|
// +---------+-----+
// |       US| 2.55|
// +---------+-----+

不太优雅的方法是使用UDF:

import org.apache.spark.sql.Row
import org.apache.spark.sql.functions.udf

def userAverage(country: String) = udf((visits: Seq[Row]) => Try {
   val filtered = visits
     .filter(_.getAs[String]("placeName") == country)
     .map(_.getAs[String]("rating").toDouble)
   filtered.sum / filtered.size
}.toOption)

df.select(userAverage("US")($"visited").as("tmp")).na.drop.agg(avg("tmp"))

注意:这是在问题中通过计算平均值而得出的解题,该平均值与接受的答案不同。对于简单的平均值:

val result = df
  .select(explode($"visited").alias("visit"))
  .groupBy($"visit.placeName")
  .agg(avg($"visit.rating".cast("double")))

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Spark:如何使用Struct数组列表解析多个json?

来自分类Dev

Flutter-如何使用Flutter中的列表解析嵌套的JSON结构?

来自分类Dev

将具有多个值的字符串列表解析为JSON

来自分类Dev

如何使用列表解析创建三角形列表?

来自分类Dev

将html嵌套列表解析为perl数组

来自分类Dev

Elixir将JSON列表解码为Struct

来自分类Dev

如何通过simpleframework在没有父级的情况下使用元素列表解析XML

来自分类Dev

如何使用几个属性和一个选项列表解析XML

来自分类Dev

如何在Swift中使用多个数组解析JSON

来自分类Dev

如何使用GSON解析多个嵌套的JSON对象/数组?

来自分类Dev

如何使用Symfony Dom搜寻器将HTML表解析为数组

来自分类Dev

将JSON列表解析为一个对象

来自分类Dev

如何使用CasperJS将html数据表解析/映射到JSON对象?

来自分类Dev

使用数组解析Json对象并使用Java中的Apache Spark映射到多个对

来自分类Dev

如何从jsonstring中的列表解析自定义对象?

来自分类Dev

如何将html表解析为多维数组

来自分类Dev

修改函数以在Python中使用列表解析

来自分类Dev

从python中的列表解析

来自分类Dev

使用 Spark 从 JSON 解析字典数组

来自分类Dev

使用android解析多个Json数组内的Json数组

来自分类Dev

列表解析以过滤嵌套的python列表数据(json api请求或转换后的列表python)

来自分类Dev

用jsonlite嵌套列表解析

来自分类Dev

F#-列表解析以替换循环

来自分类Dev

Python 列表解析(包括 int、str)

来自分类Dev

将列表解析为地图

来自分类Dev

如何使用 Jackson 将嵌套值从 JSON 数组解析为列表

来自分类Dev

JSON.NET将嵌套的接口列表解析为具体的类

来自分类Dev

如何使用改造解析json数组?

来自分类Dev

如何将多个表解析为一个数据框?

Related 相关文章

  1. 1

    Spark:如何使用Struct数组列表解析多个json?

  2. 2

    Flutter-如何使用Flutter中的列表解析嵌套的JSON结构?

  3. 3

    将具有多个值的字符串列表解析为JSON

  4. 4

    如何使用列表解析创建三角形列表?

  5. 5

    将html嵌套列表解析为perl数组

  6. 6

    Elixir将JSON列表解码为Struct

  7. 7

    如何通过simpleframework在没有父级的情况下使用元素列表解析XML

  8. 8

    如何使用几个属性和一个选项列表解析XML

  9. 9

    如何在Swift中使用多个数组解析JSON

  10. 10

    如何使用GSON解析多个嵌套的JSON对象/数组?

  11. 11

    如何使用Symfony Dom搜寻器将HTML表解析为数组

  12. 12

    将JSON列表解析为一个对象

  13. 13

    如何使用CasperJS将html数据表解析/映射到JSON对象?

  14. 14

    使用数组解析Json对象并使用Java中的Apache Spark映射到多个对

  15. 15

    如何从jsonstring中的列表解析自定义对象?

  16. 16

    如何将html表解析为多维数组

  17. 17

    修改函数以在Python中使用列表解析

  18. 18

    从python中的列表解析

  19. 19

    使用 Spark 从 JSON 解析字典数组

  20. 20

    使用android解析多个Json数组内的Json数组

  21. 21

    列表解析以过滤嵌套的python列表数据(json api请求或转换后的列表python)

  22. 22

    用jsonlite嵌套列表解析

  23. 23

    F#-列表解析以替换循环

  24. 24

    Python 列表解析(包括 int、str)

  25. 25

    将列表解析为地图

  26. 26

    如何使用 Jackson 将嵌套值从 JSON 数组解析为列表

  27. 27

    JSON.NET将嵌套的接口列表解析为具体的类

  28. 28

    如何使用改造解析json数组?

  29. 29

    如何将多个表解析为一个数据框?

热门标签

归档