【问题标题】:Parse complex string in spark streaming在火花流中解析复杂的字符串
【发布时间】:2019-04-10 11:24:34
【问题描述】:

我从 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 数组。不像上面提到的那样。

【问题讨论】:

标签: json apache-spark spark-streaming jsonparser


【解决方案1】:

要使用 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

【讨论】:

    猜你喜欢
    • 2014-10-27
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多