質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
BigQuery

BigQueryは、Google Cloud Platformが提供しているビッグデータ解析サービス。数TB(テラバイト)またはPB(ペタバイト)の膨大なデータに対し、SQL風のクエリを実行し、高速で集計・分析を行うサービスです。

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

解決済

2回答

1411閲覧

Bigqueryにカラム数が可変のCSVをインポートする方法

sodneter

総合スコア11

BigQuery

BigQueryは、Google Cloud Platformが提供しているビッグデータ解析サービス。数TB(テラバイト)またはPB(ペタバイト)の膨大なデータに対し、SQL風のクエリを実行し、高速で集計・分析を行うサービスです。

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

0グッド

1クリップ

投稿2019/07/29 14:28

前提・実現したいこと

  • 定期的に、カラム数が可変のCSVファイルをBigqueryに挿入したい
  • Bigquery側でスキーマを自動更新したい

発生している問題・エラーメッセージ

  • カラムが固定のCSVを挿入することはできています (構造体にマッピングしてそれをPutする)
  • 今回の場合、CSVのカラム数が可変のため、構造体をあらかじめ定義することができません

  • 例えば、次のようなデータを同じテーブルに書き込みたい
  • カラム数は可変ですが、それを事前にはわからず構造体をあらかじめ定義できないという前提です

1.csv

1id,name,value1,value2 21,hoge,10,20 32,hoge,20,30

1.csv

1id,name,value1,value2,value3 21,fuga,100,200,300 32,fuga,200,300,400

試したこと

色々と調べてみましたが、構造体にマッピングする方法しか出てこず、途方にくれています。
ヒントだけでもよいので、ご教示いただけると幸いです。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nobonobo

2019/07/29 23:46 編集

DBメンテナンスの時にテープル定義スキーマの厳格さがその後のコストを大きく変動させます。 僕ならカラム数が変動するものを一つのテーブルに入れたいと言われたら理由を確認したい。そうしたい理由は何でしょうか? また、CSVファイルの中でカラム数の変動を許容しますか?value#の個数を有限に、例えば1以上5以下に制限することは可能ですか?
sodneter

2019/07/30 07:50

ご質問ありがとうございます。 >value#の個数を有限に、例えば1以上5以下に制限することは可能ですか? 個数の制限はできません。 質問の背景には、ある計測ツールのデータを、CSVを返すAPI経由でBIgqueryに毎日insertを行いたいという目的があります。 計測ツールから返されるデータにはアプリ内で実装しているイベントの値が含まれており、このイベントの数はアプリのアップデートに応じて変動するため、カラム数が可変となります。(例におけるvalueがイベントの数だけあるイメージです) その意味では、例えば最初のinsertでvalue1,value2, value3があり、次にvalue2,value3,value4となった場合、value4のカラムを追加してvalue1には0またはnilを入れるという形でも問題ないという状況です。 少々わかりづらい点があるかとは思いますが、お力添えいただけますと幸甚です。 またご不明点あれば回答させていただきますので、よろしくお願いいたします。
nobonobo

2019/07/30 10:14

テーブルのカラム定義は固定して扱うのが一般的です。 また、ひとつのテーブルに入れるためにはカラム数の制限をなくすことは出来ません。(ほとんどのSQLデータベースはカラム数の上限が意外と少ない数で決められています) 「カラム数を片手の指で数えられる値に制限できる」ならNULL可能な最大カラム数でテーブル定義を確定させるのが一般的です。 もう一つのやり方は「id,name,values」という3カラムのテーブル定義にすることです。 この場合、valuesの値の格納方法や取り出し方はアプリ側の責任で行います。 最もおすすめの方法は、大きく変動するような可変数の値を格納しつつクエリも書きやすくするにはテーブル設計にて縦に並べ直した「values用のテーブル」を別途設けてそちらに可変個数のデータを入れ元のテーブルとリレーションを定義します。関係データベースにおける配列などのキーワードで調査してみてください。
sodneter

2019/08/22 07:11

返信遅くなり大変申し訳ございません。 こちらBigQueryの分割テーブルという機能を用いることで目的を達成することができました。 質問の主題に沿った回答ではnobonoboさんの回答がベストアンサーだと思いますので、こちらをコピペで良いので回答欄に記述いただけないでしょうか?ベストアンサーに設定させていただきたく存じます。 この度は親切な回答をいただきありがとうございました。
guest

回答2

0

ベストアンサー

テーブルのカラム定義は固定して扱うのが一般的です。
また、ひとつのテーブルに入れるためにはカラム数の制限をなくすことは出来ません。(ほとんどのSQLデータベースはカラム数の上限が意外と少ない数で決められています)

「カラム数を片手の指で数えられる値に制限できる」ならNULL可能な最大カラム数でテーブル定義を確定させるのが一般的です。

もう一つのやり方は「id,name,values」という3カラムのテーブル定義にすることです。
この場合、valuesの値の格納方法や取り出し方はアプリ側の責任で行います。

最もおすすめの方法は、大きく変動するような可変数の値を格納しつつクエリも書きやすくするにはテーブル設計にて縦に並べ直した「values用のテーブル」を別途設けてそちらに可変個数のデータを入れ元のテーブルとリレーションを定義します。関係データベースにおける配列などのキーワードで調査してみてください。

投稿2019/08/22 09:26

nobonobo

総合スコア3367

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

最初、いったんCSVの並びに合わせたワークテーブルに取り込んでから、目的のテーブルに統合しては?

投稿2019/07/29 16:21

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問