Разобрать сложную струну в искровом потоке - PullRequest
0 голосов
/ 07 ноября 2018

Я получаю потоковый набор данных из концентраторов событий 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 Ответ

0 голосов
/ 07 ноября 2018

Для работы с форматом типа 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"));

Более того, если есть необходимость иметь гораздо более сложные и настраиваемые структуры данных, вы можете создать Entity и использовать его в методе fromJson вместо класса Map в приведенном выше примере. И в качестве примера Json, если есть массив или список этих сложных объектов, вы можете использовать TypeToken для определения входной структуры Json и использовать ее в методе fromJson, как показано в следующем примере:

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

для получения дополнительной информации о TypeToken, вы можете использовать эту ссылку: TypeToken

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...