Github on BigQueryを使ってgoでよく使われるpackageを調べる

## Github on BigQueryとは

[Google Cloud Platform Blog: GitHub on BigQuery: Analyze all the open source code](https://cloudplatform.googleblog.com/2016/06/GitHub-on-BigQuery-analyze-all-the-open-source-code.html)
にあるように、Githubにある全てのオープンなソースコードに対してBigQueryからクエリがかけられます。すごい。


## Goで使われているpackageを調べる

以下にあるサンプルに、よく使われるgoのpackageを調べるクエリが載っている。

[GitHub Data  |  BigQuery  |  Google Cloud Platform](https://cloud.google.com/bigquery/public-data/github#github)

例ではTop10だが、30にしてやってみた。

以下のクエリ例では `sample_xxx`というデータを間引いた小さなテーブルを参照してますが、結果は `sample_`を取り除いたテーブルに対して実行しています。

**クエリ**

```
SELECT
  REGEXP_EXTRACT(line, r'"([^"]+)"') AS url,
  COUNT(*) AS count
FROM
  FLATTEN( (
    SELECT
      SPLIT(SPLIT(REGEXP_EXTRACT(content, r'.*import\s*[(]([^)]*)[)]'), '\n'), ';') AS line,
    FROM (
      SELECT
        id,
        content
      FROM
        [bigquery-public-data:github_repos.sample_contents]
      WHERE
        REGEXP_MATCH(content, r'.*import\s*[(][^)]*[)]')) AS C
    JOIN (
      SELECT
        id
      FROM
        [bigquery-public-data:github_repos.sample_files]
      WHERE
        path LIKE '%.go'
      GROUP BY
        id) AS F
    ON
      C.id = F.id), line)
GROUP BY
  url
HAVING
  url IS NOT NULL
ORDER BY
  count DESC
LIMIT 30
```

**結果**


|  | url | count |
|--:|:--|--:|
| 1 | fmt | 692434 |
| 2 | time | 390527 |
| 3 | strings | 364287 |
| 4 | testing | 311692 |
| 5 | os | 311061 |
| 6 | net/http | 224422 |
| 7 | io | 193310 |
| 8 | bytes | 191048 |
| 9 | errors | 183711 |
| 10 | io/ioutil | 173026 |
| 11 | encoding/json | 163164 |
| 12 | strconv | 162616 |
| 13 | log | 141918 |
| 14 | sync | 135247 |
| 15 | reflect | 115058 |
| 16 | path/filepath | 107154 |
| 17 | net | 96514 |
| 18 | net/url | 79102 |
| 19 | sort | 67765 |
| 20 | context | 59503 |
| 21 | golang.org/x/net/context | 59146 |
| 22 | flag | 59020 |
| 23 | runtime | 58575 |
| 24 | regexp | 58526 |
| 25 | k8s.io/kubernetes/pkg/api | 52827 |
| 26 | path | 52798 |
| 27 | github.com/golang/glog | 52015 |
| 28 | k8s.io/apimachinery/pkg/apis/meta/v1 | 49840 |
| 29 | math | 47452 |
| 30 | bufio | 45251 |


上位は基本的に標準packageが多いです。
次に、標準packageでないものを調べたかったのでimportにURLが含まれるものを調べてみました。

**クエリ**

```
SELECT
  REGEXP_EXTRACT(line, r'"([^\.]+\.[^"]+)"') AS url,
  COUNT(*) AS count
FROM
  FLATTEN( (
    SELECT
      SPLIT(SPLIT(REGEXP_EXTRACT(content, r'.*import\s*[(]([^)]*)[)]'), '\n'), ';') AS line,
    FROM (
      SELECT
        id,
        content
      FROM
        [bigquery-public-data:github_repos.sample_contents]
      WHERE
        REGEXP_MATCH(content, r'.*import\s*[(][^)]*[)]')) AS C
    JOIN (
      SELECT
        id
      FROM
        [bigquery-public-data:github_repos.sample_files]
      WHERE
        path LIKE '%.go'
      GROUP BY
        id) AS F
    ON
      C.id = F.id), line)
GROUP BY
  url
HAVING
  url IS NOT NULL
ORDER BY
  count DESC
LIMIT 30
```

**結果**

|  | url | count |
|--:|:--|--:|
| 1 | golang.org/x/net/context | 59146 |
| 2 | k8s.io/kubernetes/pkg/api | 52827 |
| 3 | github.com/golang/glog | 52015 |
| 4 | k8s.io/apimachinery/pkg/apis/meta/v1 | 49840 |
| 5 | github.com/stretchr/testify/assert | 42613 |
| 6 | github.com/onsi/ginkgo | 34234 |
| 7 | github.com/onsi/gomega | 34054 |
| 8 | github.com/spf13/cobra | 31093 |
| 9 | github.com/Sirupsen/logrus | 28731 |
| 10 | k8s.io/apimachinery/pkg/runtime | 28554 |
| 11 | gopkg.in/check.v1 | 22537 |
| 12 | github.com/pkg/errors | 22353 |
| 13 | k8s.io/api/core/v1 | 20038 |
| 14 | github.com/juju/errors | 18756 |
| 15 | github.com/aws/aws-sdk-go/aws | 17602 |
| 16 | k8s.io/kubernetes/pkg/runtime | 17278 |
| 17 | k8s.io/kubernetes/pkg/api/v1 | 15727 |
| 18 | k8s.io/apimachinery/pkg/types | 15658 |
| 19 | github.com/sirupsen/logrus | 15291 |
| 20 | k8s.io/kubernetes/pkg/api/unversioned | 15111 |
| 21 | k8s.io/apimachinery/pkg/runtime/schema | 15102 |
| 22 | k8s.io/apimachinery/pkg/api/errors | 14614 |
| 23 | google.golang.org/grpc | 14068 |
| 24 | github.com/Azure/go-autorest/autorest | 13074 |
| 25 | k8s.io/apimachinery/pkg/labels | 13049 |
| 26 | github.com/stretchr/testify/require | 13042 |
| 27 | k8s.io/apimachinery/pkg/watch | 12363 |
| 28 | k8s.io/client-go/rest | 11300 |
| 29 | github.com/Azure/go-autorest/autorest/azure | 11263 |
| 30 | github.com/juju/testing/checkers | 10800 |


ログとかテスト系が多い中に、kubernetes関係がちょこちょこ入ってきてる。

以上は2018/8/23に更新しました。