2016-04-05 10 views
0

私は比較的新しいHadoopで、何らかの問題を解決するための方法とツールが何百もあることを理解しています。私は、一般的に受け入れられるベスト・プラクティス・アプローチを通して、私が比較的一般的なシナリオであると思っている問題を解決するために私を歩いてくれる人を探しています。Hadoop - 変数列を持つCSVファイルのコレクションにSQLインターフェイスを公開する

私は制御しないプロセスからいくつかのCSVファイルを生成しています。 CSVファイルは関連していますが、各CSVファイルには異なる列セットが含まれている場合があります。実際には、数千のファイルがあり、何千もの列が存在することになるので、私は下の2つのファイルの作成例を提供しています。

FILE1

#COL1, COL3, COL4 
a1, c1, d1 
a2,,d2 
a3,c3,d3 

FILE2

#COL1, COL2, COL4 
a1, b1, d6 
a5, b5, 
a3,, 

私は最終的には、理論的に持っているであろう、このデータ上のSQL/JDBCを介してアクセスできる表形式のビューのいくつかの種類を公開したいと思います構造は次のとおりです。

#COL1, COL2, COL3, COL4 
a1,,c1,d1 
a1,b1,,d6 
a3,,c3,d3 
a3,c3,, 
a5,b5,, 

キーポイントは以下のとおりです。

  1. は、私は新しいものを新しいファイルで発見されているような単純なプロセスが利用可能に列を更新できるようにしたいと思います。
  2. すべてのファイルのすべての列のリストが数千になっているときに、ユーザーが一度に10-20列のみを分析または操作したい場合は、パフォーマンス上のペナルティを受けることは望ましくありません。

答えて

0

これはおそらく部分的な回答にすぎませんが、私は少なくともあなたのデータ構造に対処することができます。あなたはおそらくこれに類似した構造をしたいと思う(関係なく、DBMSの)SQLデータベース内の可変サイズのデータ​​を格納するために探しているなら...

追加注: 私は主に以下を使用します着信データの「ステージングフェーズ」。最終製品/浄化された最終形式のデータを格納するテーブルを含む最終的なデータベース/スキーマが存在する必要があります。これらのテーブルは、データをシステムに取り込むためにのみ使用してください。そこから、この中間データを最終テーブルにコピーまたは移動するプロセス(自動化されたものなど)を作成し、サニタイズ、正規化、全面的なクリーニングと検証を行います。この提案された考え方は、解決策全体であることを意味するものではなく、入力データの可変構造の問題に対処する単なる手段です。

カラム名の指定に使用される主な「カラム参照」テーブルが必要です。私たちは、単に、column_namesそれを呼び出します。

CREATE TABLE column_names 
(
    c_id INT, 
    c_name VARCHAR(20), 
    c_size INT 
); 

データのサンプルは次のようになります:

c_int | c_name | c_size 
============================== 
1  | col1  | 10 
2  | col2  | 5 
3  | col3  | 20 
4  | f_name | 25 
5  | l_name | 25 

したい場合我々は、より粒度を提供するために、複数のフィールドを追加することができますあなたのフィールド定義(すなわち、データ型、nullableなど...)、または上記のままにして、単純で一般的な構造を提供してください。私たちは、すべての着信データを文字列/ varcharとして想定し、変換します。これは、今のところ少し単純です。

その後、「インポートセッション」と呼ぶことができます。

CREATE TABLE import_session 
(
    session_id INT NOT NULL UNIQUE, 
    create_date TIMESTAMP 
); 

サンプルデータ:

session_id | create_date 
===================================== 
11123  | 2015-02-15 15:33:21 

あなたが必要な場合は、再度、これはより具体的な得ることができるが、上記の例のための目的を果たす必要があります。

次に、インポートのための構造が必要です。これにより、一般的な構造の再利用が可能になります。それをimport_structと呼びます。

CREATE TABLE import_struct 
(
    struct_id INT 
    c_id INT 
); 

サンプルデータ:122と37

最後に、我々はデータ格納テーブルを必要とする

CREATE TABLE session_data 
(
    session_id INT, 
    struct_id INT, 
    session_recid INT, 
    c_id INT, 
    c_data VARCHAR(1000) 
); 

シンプルなデータのインポート:

struct_id | c_id 
======================= 
122   | 5 
122   | 4 
122   | 1 
122   | 2 
37   | 1 
37   | 2 
37   | 3 

このサンプルでは、​​二つの構造が含まれています次のようになります:

session_id | struct_id | session_recid | c_id | c_data 
================================================================================= 
11123  | 122   | 1    | 5  | Smith 
11123  | 122   | 1    | 4  | John 
11123  | 122   | 1    | 1  | 5551235555 
11123  | 122   | 1    | 2  | 90210 
11123  | 122   | 2    | 5  | Lincoln 
11123  | 122   | 2    | 4  | Abe 
11123  | 122   | 2    | 1  | 5551235511 
11123  | 122   | 2    | 2  | 90210 
11123  | 122   | 3    | 5  | Washington 
11123  | 122   | 3    | 4  | George 
11123  | 122   | 3    | 1  | 5551239999 
11123  | 122   | 3    | 2  | 90210 

このデータベースの設計は、あなたがしようとしていることに対して正しい方向に進むことを望みます。これは、データを構造化する非常に基本的で非常に一般的な方法です。数回言及したように、構造内でより具体的なものを得ることができます。そこにテーブルを追加して、関係を作成し、データの整合性を強化することができます。しかし、これはあなたを始めるはずです。

+0

こんにちは!私があなたを正しく理解していれば、キー値のペアを使用してデータを保存することを提案していますか?この形式で最終的な分析を行うことを推奨していないと思いますか?ある時点で、私はこのデータのために円柱形に戻らなければならないでしょう。残念ながら、データの摂取は継続的であり、摂取が停止した時点を正確に把握することはできません。私は、新しいデータが取り込まれるときに更新され続けるために、データの最後のカラムビューを必要とします。 –

+0

ボリュームに応じて、データを変換する1時間ごと、1日2回、1日などのバッチジョブを実行できます。即時にする必要がある場合は、セッションテーブルのトリガーに書き込むこともできます。最初のインポートをトランザクションとして行い、トランザクションがコミットされたら変換/サニタイズを初期化します。最後のステップは、その終了したセッションバッチに関連するすべてのデータを削除することです。 – gmiley

関連する問題