【问题标题】:spark parse json field and match to different case classspark解析json字段并匹配不同的案例类
【发布时间】:2018-10-02 04:22:20
【问题描述】:

我有一些像下面这样的 json,当我加载这个 json 时,一些字段是 json 字符串,

如何使用 spark scala 解析此 json 并在该 json 中查找我要查找的关键词

{"main":"{\"payload\": { \"mode\": [\"Node\"], \"currentSatate\": \"Ready\", \"Previousstate\": \"slow\", \"trigger\": [\"11\", \"12\"], \"AllStates\": [\"Ready\", \"slow\", \"fast\", \"new\"],\"UnusedStates\": [\"slow\", \"new\"],\"Percentage\": \"70\",\"trigger\": [\"11\"]}"}

{"main":"{\"payload\": {\"trigger\": [\"11\", \"22\"],\"mode\": [\"None\"],\"cangeState\": \"Open\"}}"}

{"main":"{\"payload\": { \"trigger\": [\"23\", \"45\"], \"mode\": [\"Edge\"], \"node.postions\": [\"12\", \"23\", \"45\", \"67\"], \"node.names\": [\"aa\", \"bb\", \"cc\", \"dd\"]}}" }

这是加载到数据框后的样子

val df = spark.read.json("<pathtojson")
df.show(false)

+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|main                                                                                                                                                                                                                           |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|{"payload": { "mode": ["Node"], "currentSatate": "Ready", "Previousstate": "slow", "trigger": ["11", "12"], "AllStates": ["Ready", "slow", "fast", "new"],"UnusedStates": ["slow", "new"],"Percentage": "70","trigger": ["11"]}|
|{"payload": {"trigger": ["11", "22"],"mode": ["None"],"cangeState": "Open"}}                                                                                                                                                   |
|{"payload": { "trigger": ["23", "45"], "mode": ["Edge"], "node.postions": ["12", "23", "45", "67"], "node.names": ["aa", "bb", "cc", "dd"]}}                                                                                   |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

由于我的 json 文件对于所有 3 个 json 字符串都是不同的,有没有办法匹配定义 3 个案例类并匹配

我只知道匹配一个类

val mapper = new ObjectMapper() with ScalaObjectMapper
mapper.registerModule(DefaultScalaModule)
val parsedJson = mapper.readValue[classname](jsonstring)

有没有办法创建一个多重匹配的案例类并匹配到任何特定的类?

【问题讨论】:

    标签: scala apache-spark apache-spark-sql


    【解决方案1】:

    你使用的是Spark SQL,你要做的第一件事就是把它变成一个数据集,然后使用spark的方法来处理它们。不要到处使用 Json(例如,在 Play 中)。第一个任务是把它变成一个数据集。

    您可以将 Json 序列化为案例类:

    val jsonFilePath: String = "/whatever/data.json" 
    val myDataSet = sparkSession.read.json(jsonFilePath).as[StudentRecord]
    

    然后这里有StudentRecord 的数据集。所以,你现在可以使用 spark 的 groupBy 方法从数据集中获取你想要的列的数据:

    myDataSet.groupBy("whateverTable.whateverColumn").max() //could be min(), count(), etc...
    

    额外说明:您的 Json 应该“清理”一下。例如,如果它在您的程序中,您可以使用多行方式声明您的 Json,然后您不需要到处使用转义字符:

    val myJson: String =
      """
        {
        }
      """.stripMargin
    

    如果在文件中,那么你写的Json是不正确的。所以首先,确保你有一个语法正确的 Json 来处理。

    【讨论】:

    • 是的,问题是用“”包围的字段之一,读取为json中的字符串,我需要进一步解析它以提取值,在我的情况下你可以检查“ main" 是字符串及其值为json字符串的列
    • @user3607698 我更新了答案。我认为首先你需要检查你的 Json 是否有语法错误。
    • 复制 json 时出现了一个错字,现在我已经发布了一个正确的,以及加载到数据框后的样子
    猜你喜欢
    • 1970-01-01
    • 2017-12-29
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    • 2021-12-09
    • 2019-03-09
    • 1970-01-01
    相关资源
    最近更新 更多