当前位置: 首页 > 知识库问答 >
问题:

解析spark流中的复杂字符串

马天逸
2023-03-14

我正在从Azure事件中心获取流数据集。数据采用以下格式:

[
  [
    {
      "data": "sampledata1",
      "addressdata": {
        "isTest": false,
        "address": "washington",
        "zipcode": 98119,
        "city": "seattle",
        "randomstring": "abcdabcd:ghkjnkasd:asdasdasd"
      },
      "profession": "engineer",
      "party": "democrat"
    },
    {
      "data": "sampledata2",
      "addressdata": {
        "isTest": false,
        "address": "virginia",
        "zipcode": 20120,
        "city": "Centreville",
        "randomstring": "zabcdabcd:tghkjnkasd:gasdasdasd"
      },
      "profession": "teacher",
      "party": "republican"
    }
  ]
]

从下面的文章中,我可以得到json作为原始字符串。https://docs.databricks.com/spark/latest/structured-streaming/streaming-event-hubs.html

但是我不能使用get_jon_object从字符串中提取单个项目。我认为问题在于字符串不是单个的json对象,它是一个json数组的数组。因此,get_json_object无法解析它。

val outputDf = streamingInputDf.select(
     get_json_object(($"body").cast("string"), "$.data").alias("data"), 
     get_json_object(($"body").cast("string"), "$.addressdata").alias("addressdata"), 
     get_json_object(($"body").cast("string"), "$.profession").alias("profession"), 
     get_json_object(($"body").cast("string"), "$.party").alias("party"), 
     date_format($"enqueuedTime", "dd.MM.yyyy").alias("day"),
     date_format($"enqueuedTime", "HH").cast("int").alias("hour") ,
     when(date_format($"enqueuedTime", "mm").cast("int")<=15,1)
    .when(date_format($"enqueuedTime", "mm").cast("int")>15 && date_format($"enqueuedTime", "mm").cast("int")<=30,2)
    .when(date_format($"enqueuedTime", "mm").cast("int")>30 && date_format($"enqueuedTime", "mm").cast("int")<=45,3)
    .otherwise(4).alias("minute")
)   

有人有任何建议,如何优雅地解析数据并从字符串中提取个人信息?任何类似于get_json_object的方法,可以从json数组中提取数据?

PS:我在一行中获取json的数组。不像上面提到的那样。

共有1个答案

步建茗
2023-03-14

要使用Json类型格式,java中有很多工具可以使用。但是根据我在不同平台的经验,根据性能和准确性等不同方面,Google Gson确实是最好的。(Gson库:https://github.com/google/gson)

此外,它真的很容易使用,如下面的示例代码:

String json = {"insurance1":45.1,"insurance2":505.5};
Gson gson = new Gson();
Map<String, Float> jsonObj = gson.fromJson(json, Map.class);
System.out.println(jsonObj.get("insurance1"));

此外,如果需要具有更复杂和自定义的数据结构,则可以创建一个实体,并在上面的示例中使用 fromJson 方法而不是 Map 类。作为示例 Json,如果有这些复杂对象的数组或列表,则可以使用 TypeToken 来定义输入 Json 结构,并在 fromJson 方法中使用它,如下面的示例格式所示:

new TypeToken<ArrayList<Class.forName(MyClass)>>

有关TypeToken的更多信息,您可以使用此链接:TypeToken

 类似资料:
  • 我有一个非常复杂的字符串,如下所示, 这里所有的JSON数据都在括号“[]”中,括号之间用“{…}”分隔支撑。在这里,我想要一个从所有花括号的消息,故事和属性。尝试了两件事一是二把所有的东西都放在一个JSON对象中,也尝试了一次无用的尝试来匹配regex“message:”但即使这样也没用。 从所有大括号中查找消息、故事和属性的方法是什么。

  • 我有以下格式的json文件: 那么,我如何在pig中解析这个json。。 此外,categories和rep中可以有一些char。。可能并不总是空的。我做了以下尝试。 但我得到这个错误: 组织。科德豪斯。杰克逊。JsonParseException:意外字符('D'(代码68)):在[源代码:java.io]处应为有效值(数字、字符串、数组、对象、“true”、“false”或“null”)。By

  • 我有一串串弦 我想把它们转换成整数,然后用reduce方法求和。我正在以以下格式使用reduce: 我得到这个错误:

  • 我有一个输入表单,允许某人键入unicode字符。所以它可能是类似于“嘿,uF32A怎么了?如果我得到这个字符串,它将有一个子字符串“\uF32A”,我如何将其转换为字符“\uF32A”?

  • 我在解析从Excel中的API检索的XML文件时遇到问题。我可以成功地检索数据集(如下所示),但我找到的将每个字段格式化为其自身单元格的表格式的解决方案没有奏效,我认为这是因为XML的格式化方式。 每个XML看起来都类似于下面的内容。可能需要独立提取多个消息ID。(这是我遇到的另一个问题。“消息ID”中的空格引发了各种错误。) 下面是我尝试使用的解决方案:如何使用vba解析XML 下面是我尝试拉取