256以上の変数を持つテーブルをどのように処理できますか?


10

私は国勢調査データを使用して、いくつかのCSVファイルをダウンロードしました。各CSVファイルには、600個の列/変数が含まれています。それらすべてをクエリ可能なデータベースに格納したいのですが、これまでに試したすべての操作(MS Access、Arcジオデータベーステーブル)では、テーブルが256列に切り捨てられます。DBAではない誰かがアクセスできる大きなテーブルを処理するためのソリューションはありますか?


2
DB正規化の量に関係なく、これらの巨大なテーブルは、Censusユニット(おそらくブロック?)UIDに関連するいくつか(または多く)の小さなテーブルに分割する必要があると思います。
ロイ

回答:


7

PostgreSQLの列の制限は「列タイプに応じて」250〜1600で、空間データとPostGIS拡張機能によるクエリをサポートします。だから私は2つのことをする傾向があります:

まず、列がフリーテキストではなくカテゴリを表す場合は、それらのカテゴリで別のテーブルを作成し、カテゴリテーブルを参照して、列を整数IDおよび外部キー制約に置き換えます。

次に、大きなテーブルを論理的に2つ以上に分割して第3正規形を壊し、それらの間に1対1の関係を設定します。これはおそらく最も効率的ではありませんが、データの一部がほとんど必要ない場合は、クエリは必要なテーブルに対してのみ実行できます。

別の完全に異なる代替案は、MongoDB、CouchDBなどの「NOSQL」データベースを使用することです。「行」のサイズに固定された制限はなく、レコードのデータが存在しない場合でも、領域を占有する必要はありません。

これらのタイプのビッグテーブルデータベースの空間サポートはそれほど良くありませんが、MongoDBは2D空間クエリとデータをサポートしており、CouchDBは同様の機能を持っているようです。


4
+1結合ソリューション(パラグラフ3)は実際には非常に効率的です。国勢調査データには関連するフィールドのグループが含まれる傾向があり、特定の分析ではこれらのグループの数が少ない場合が多いためです。この方法では、何千ものフィールド(私は誇張ではありませんが、これは一般的です)を数十のテーブル間で論理的に分割でき、特定のマップまたは分析のためにアクセスする必要があるのは少数のテーブルだけです。
whuber

@MerseyViking、彼(@scoball)は、テーブルを操作するプログラムにデータをインポートできない場合、どのようにしてテーブルを分割したり、他の言及された操作を実行したりできますか?データはCSV形式です。
パブロ

2
@パブロ、私はあなたがMerseyVikingに不公平だと思います:テーブルをインポートするためのスクリプトを書くことが許可されている場合-本質的にソリューションを実装するために強制されます-そして彼もそうです、そして問題はありません完全に一般的で柔軟なものを書いている。(私は非常に大規模な国勢調査データベースのためにそれを行ったので、私は経験からこれを知っています。)さらに、彼は256フィールドの制限を回避する多くの代替案を提案しています。
whuber

「列がフリーテキストではなくカテゴリを表す場所」これらの列を手動でマッピングする必要があります。
パブロ

2
@Pablo不適切なソフトウェアを使用している場合のみ:-)。段落2〜3のワークフローは、たとえば、ほとんどすべての最新の統計プログラムを使用して、いくつかのコマンドで実行できます。(もちろん、データベースの代わりにそのようなプログラムを使用することを
推奨し

7

最近、2172列を含むStatistics Canadaの国勢調査プロファイルCSVファイルでまったく同じ問題に対処しました。ArcGISにアクセスできる場合は、csvをESRIファイルジオデータベース(FGDB)にインポートできます。ESRIによると、FGDB形式は、フィーチャクラスまたはテーブルの65,534フィールドを処理できます

私の場合、2172列の幅のCSVファイルを問題なくFGDBテーブルにインポートできました。

テーブル全体をFGDBに入れたら、好きな方法で(たとえば、論理的またはデータベースの制限に基づいて)スライスして、一意のID列を維持し、次のように結合できるようにします。必要。


1
面白い!CSVからファイルジオデータベースへのインポートを試みました。設定しているときに、インポートする変数のリストを確認したところ、256個の変数の後に変数のリストが表示されなくなったため、続行しませんでした。もう一度見てみましょう。
scoball 2012

2
このリンクを確認してください:assets.nhgis.org/How_to_Import_256_Columns_GIS.pdf
Brent Edwards

ファイルジオデータベースには高い制限があるため、インポートで何かが発生した可能性があります。
nicksan 2012

2

短い:
多くの属性を持つ、または各オブジェクトの変数属性タイプを持つデータの私のオプションは、KEY / VALUEデータモデルを使用することです。これは、SQLで実装でき、非常にうまく機能します(postgresql + postgisをお勧めします)。

説明:
1)ポイント、たとえば、フィーチャのテーブルが1つあります。このテーブルには、各ポイントのIDとジオメトリが保持されます。

2)キー/値のペアである「属性」のテーブルがもう1つあります。このテーブルには、ID、POINT_ID(FK)、KEY(varchar)、VALUE(varchar)の列があります。

これで、各ポイントは、そのように格納された実質的に無限の属性を持つことができます。

ID   POINT_ID   KEY   VALUE
1        1      type     burger shop
2        1      name     SuperBurger
3        1      address  123, a ST.

OpenStreetMapsはそのように機能し、非常にうまく機能しますここここを参照ください

データをインポートするには、Pythonスクリプトをお勧めします。


これはデータの「長い」形式と呼ばれることが多く、知っておくと便利です。柔軟なストレージには問題ありませんが、あらゆる種類の多変量分析(2つ以上の属性を比較する分析)には役に立ちません。
whuber

@whuber、多変量解析には役に立たないですが、実際には、データを準備する必要があるため、非常に構造化されたソフトウェアまたは優れたプログラミングスキルが必要です。ここでは、postgis + django(python webフレームワーク)の組み合わせを使用して、土壌データ(ph、al、clayなど)を処理する前にデータの抜粋をテーブルに入れます。同じモデルが他の任意の時間厳守データを処理するため、このモデルが選択されました。
Pablo

十分に公正:私は「現状のままでは役に立たない」と言うべきでした。すべての情報が保持されている場合、保持されます。データはいつでも任意の形式に処理できます。キー/値アプローチと比較して、@ MerseyVikingのメソッドを使用した処理は比較的簡単です。また、テーブルが非常に大きくなると、合計サイズが気になり始めます。キー/値ストレージにおける冗長性は、めったに非常に大規模なデータセットの分析に使用されないように素晴らしいです(私は保存のために純粋にその使用頻度に話すことができません。)
whuber

データベースでデータを開くことができない場合、テーブルを分割または操作するのは簡単ではない、不可能ではないので、私は彼の解決策に同意しません。ユーザーはスクリプトを介してデータベースにデータを直接送信する必要があり、キー/値モデルを使用すると、列をマップしたり属性を分類したりすることなく、すべてのデータに同じスクリプトを使用できます。
パブロ

あなたの解決策は、あなた自身の承認により、私のようにプログラム的に複雑であるように見えます-「優れたプログラミングスキル」が必要です。私は、PostgreSQLなどのRDBMSに最も効率的な形式でデータを保持することを単に主張しました。その上、ブレントの答えが256カラムの制限が偽であることを示しているので、それは議論の余地があるように見えます。
MerseyViking 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.