BigqueryのJSONデータをRで読み込む際はndjsonのstream_in関数を利用する

Bigqueryで取得したデータを整形したい。

Bigqueryで全て完結するならそうしたいがとりあえず時間がないのである程度BQでやってあとはRでやることにする。

しかしネストされているのでJSONでしかダウンロードできないよと言われてしまった。

んじゃJSONでダウンロードしてjsonliteパッケージので読もうとしたら以下のようなエラーが出た。

parse_con(txt, bigint_as_char) でエラー: parse error: trailing garbage

検索すると以下のSOにたどり着く。

https://stackoverflow.com/questions/26519455/error-parsing-json-file-with-the-jsonlite-package/26522000

どうやら各行はJSONのフォーマットになっているものの各オブジェクトがJSONフォーマットに則っていないらしい。

It turns out this is a "pseudo-JSON" file. I come across these in many naive API systems I work in. Each line is valid JSON, but the individual objects aren't in a JSON array. 

ということで行単位の処理が必要となる。 jsonliteパッケージの場合、stream_in関数を用いる。fileでコネクションを作るのがポイント。

data <- jsonlite::stream_in(file(path_data))

この場合、ネストされたオブジェクトはネストされたまま読み込まれる。

ネストされたオブジェクトをよしなに展開してほしい(flatten処理)場合はndjsonパッケージのstream_in関数が良い。この場合、明示的にコネクションを作る必要はない。

data <- ndjson::stream_in(path_data)

いかがでしたか?