スイスjson加工ナイフ

Rでjsonを効果的に使用するには?


これは、 以前の出版物の続きです。


問題文


原則として、json形式のデータの主なソースはREST APIです。 プラットフォームの独立性とデータに対する人間の認識の利便性に加えて、jsonを使用すると、非構造化データシステムを複雑なツリー構造で交換できます。


APIを構築するタスクでは、これは非常に便利です。 通信プロトコルのバージョン管理を簡単に行うことができ、情報交換の柔軟性を提供するのは簡単です。 同時に、データ構造の複雑さ(ネストレベルは5、6、10、またはそれ以上)を恐れることはありません。すべてを考慮に入れた単一レコードの柔軟なパーサーを記述することはそれほど難しくないからです。


データ処理タスクには、外部ソースからのデータの取得も含まれます。 JSON形式。 Rには、jsonをRオブジェクトに変換するように設計されたjsonliteパッケージセット(特にjsonlite )があります(データ構造が許可する場合は、 listまたはdata.frame )。


ただし、実際には、 jsonliteなどの使用が非常に非効率になると、2つのクラスの問題がしばしば発生します。 タスクは次のようになります。



イラストの同様の構造の例:


画像


画像


これらのタスククラスに問題があるのはなぜですか?


大量のデータ


原則として、json形式の情報システムからのアンロードは分割できないデータブロックです。 正しく解析するには、すべてを読み、ボリューム全体を調べる必要があります。


誘発された問題:



ツリー構造のマージ


たとえば、ビジネスプロセスがAPIを介したリクエストのパケットで動作するために必要なディレクトリを収集する必要がある場合、同様のタスクが発生します。 さらに、ディレクトリは、分析パイプラインへの組み込みとデータベースへのアップロードの可能性を統一し、準備していることを意味します。 また、これにより、このような要約データをdata.frame変換するdata.frameます。


誘発された問題:



JQ


特に困難な状況では、上記の理由でjsonliteパッケージの「すべてをRオブジェクトに変換」する非常に便利なアプローチを使用すると、深刻な誤動作がjsonliteます。 まあ、処理の最後に到達した場合。 さらに悪いことに、真ん中に腕を広げてあきらめなければなりません。


このアプローチの代替方法は、jsonデータを直接操作するjsonプリプロセッサーを使用することです。 jqライブラリとjqrラッパー。 実践では、使用量が少ないだけでなく、聞いたこともまったくないことを示しています。


jqライブラリーの利点。



処理コードは画面に合わせて圧縮され、次のようになります。


 cont <- httr::content(r3, as = "text", encoding = "UTF-8") m <- cont %>% #     jqr::jq('del(.[].movie.rating, .[].movie.genres, .[].movie.trailers)') %>% jqr::jq('del(.[].movie.countries, .[].movie.images)') %>% #     jqr::jq('del(.[].schedules[].hall, .[].schedules[].language, .[].schedules[].subtitle)') %>% #     jqr::jq('del(.[].cinema.location, .[].cinema.photo, .[].cinema.phones)') %>% jqr::jq('del(.[].cinema.goodies, .[].cinema.subway_stations)') #  m2 <- m %>% jqr::jq('[.[] | {date, movie, schedule: .schedules[], cinema}]') df <- fromJSON(m2) %>% as_tibble() 

jqは非常にエレガントで高速です! 関連する人に:ダウンロード、設定、理解。 処理を高速化し、自分自身と同僚の生活を簡素化します。


前の投稿- 「エンタープライズでRの適用を開始する方法。 実用的なアプローチの例



Source: https://habr.com/ru/post/J448950/


All Articles