Apache Cassandra に標準SQL でアクセス

by Jerod Johnson 翻訳:兵藤朋代 | 2016年04月14日

Apache Cassandra データベースは、その拡張性、可用性、信頼性と高いパフォーマンスを提供する分散ストレージシステムです。 CData Drivers for Apache Cassandra により、カスタムアプリケーションやサードパーティツール(Tableau やMS PowerBI など)から標準SQL を使ってApache Cassandra データにアクセスが可能になります。 CData Cassancra ドライバーは、標準SQL(SQL-92)クエリをCQL クエリに変換し、Apache Cassandra データを、あたかも使い慣れたRDB のように使うことを実現します。CData ドライバーでは、スタンダードなSELECT、INSERT、UPDATE、DELETE の処理に加えて、Cassandra データのテーブルへの読み替えや、クライアントサイドでのSQL 機能を提供しています。

CData Cassandra ドライバーでは、次のようにCassandra データを読み替えます。

  • Free-Form クエリ: テーブルスキーマのあるなしに関わらず、直観的にデータベースに存在していると考えられる項目をクエリ
  • Fオブジェクト&配列のフラット化: Cassandra に保管されたドキュメントと内部オブジェクトの複雑さに関わらず、動的にCassandra データを探索するための接続プロパティ設定
  • カスタムスキーマ定義: ユーザー自身でスキーマを定義し、BI、帳票、ETL ツールに対して、指定された形でデータのやり取りを可能に
  • クライアントサイドJSON 関数: Cassandra ドキュメントに対してのクライアントサイドJSON 関数処理

Free-Form クエリ

Cassandra データへの一番シンプルなデータアクセス方法は、直観的にデータベースに存在していると理解される項目を取得するクエリを投げる方法です。同一のテーブルスキーマが存在しているかに関わらず、指定した項目のデータを取得することができます。以下のドキュメントを例にします:

{
  id: 1754,
  name: "Joe Smith",
  address: {street: "9th Street", city: "New York", state: "NY"},
  children: ["John", "Sarah", "Elizabeth"],
  birthday: "1960-01-01"
}

ここで各ドキュメントから、idaddress.street、およびoffices[0] フィールドを取得したい場合に、Free クエリを使います:

SELECT
  id,
  address.street,
  children.0,
FROM Company;

指定されたフィールドにデータを有するドキュメントからは、その値が返されます。ドキュメント内に指定されたフィールドを有しない場合には、NULL が返されます。この方法は、CData ドライバーに渡されるSQL クエリを自由にコントロールできる場合には有効ですが、コントロールできない場合には使用することができません。その場合には、ほかの方法が必要です。

オブジェクト&配列のフラット化

CData ドライバーの Flatten Arrays および Flatten Objects 接続プロパティによって、Cassandra 内のオブジェクトおよび配列を動的にテーブルスキーマに読み替えて定義する方法を管理できます。

以下に例を示します:

{
  id: 1754,
  name: "Joe Smith",
  address: {street: "9th Street", city: "New York", state: "NY"},
  children: ["John", "Sarah", "Elizabeth"],
  birthday: "1960-01-01"
}

次の例では、いろいろなパターンのFlatten Arrays および Flatten Objects プロパティの設定で、下のクエリの結果がどうなるかを見てみましょう。

SELECT *
FROM People

FlattenArrays=0;FlattenObjects=False;

フラット化を行わない場合には、CData ドライバーは、テーブル内に、id、name、address、children、birthday のカラムを発見します。ドキュメント内のオブジェクトや配列は1つにまとめられて表示されます。

結果

id name address children birthday
1754 Joe Smith {street: "9th Street", city: "New York", state: "NY"} ["John", "Sarah", "Elizabeth"] 1960-01-01

FlattenArrays=0;FlattenObjects=True;

Flatten Objects を"true" に設定した場合、"address" オブジェクト内のカラムがフラット化されます。

結果

id name address_street address_city address_state children birthday
1754 Joe Smith 9th Street New York NY ["John", "Sarah", "Elizabeth"] 1960-01-01

FlattenArrays=2;FlattenObjects=False;

Flatten Arrays プロパティは、配列内のアイテムをいくつ独立したカラムとして扱うかを決定します。Flatten Arrays を"2" に設定し、Flatten Objects = "false" に設定すると、ドキュメントの配列内の頭から2つのアイテムを取得します。

結果

id name address children_0 children_1 birthday
1754 Joe Smith {street: "9th Street", city: "New York", state: "NY"} John Sarah 1960-01-01

これらのカラムはINSER やUPDATE によって拡張可能で、オブジェクトや配列を含むドキュメントを追加したり、更新したりすることができます。

カスタムスキーマ定義

Cassandra データをRDB として扱うためには、テーブルスキーマを定義しなければなりません。テーブルスキーマは接続プロパティで動的に生成するように設定する、もしくはユーザー自身でスキーマを定義することができます。次のようなドキュメントで考えてみましょう。

{
  id: 1754,
  name: "Joe Smith",
  address: {street: "9th Street", city: "New York", state: "NY"},
  children: ["John", "Sarah", "Elizabeth"],
  birthday: "1960-01-01"
}

このドキュメントに対し、id (主キー)、nameaddress.statechildren フィールドのはじめのエントリーをテーブルにするために次のスキーマを作成します:

  

    
    
    <attr  name="id"      xs:type="int32"  iskey="true" other:jsonpath="$.id" />
    <attr  name="name"    xs:type="string"  other:jsonpath="$.id"             />
    <attr  name="state"   xs:type="string"  other:jsonpath="$.address.state"  />
    <attr  name="child_1"  xs:type="string"  other:jsonpath="$.children.0"    />
    

  


このようにスキーマを定義することで、Cassandra データに対し、きめ細かなコントロールを行うことができ、データビジュアライゼーション、データ変換、他のツールの機能を発揮することが可能になります。このような機能は通常のBI、帳票、ETL ツールには含まれていません。

クライアントサイドJSON 関数

Cassandra データセットのドキュメントはJSON 構造です。CData ドライバーは、標準SQL 関数を使って、JSON 構造に対して使用することをサポートします。これらの関数では、MongoDB ドキュメントを取得し、クライアントで対応する形にパースされた値を集計します。多くの関数がサポートされており、以下の配列を使って例を示します。

[
  { "day": "Mon", "hours": 2 },
  { "day": "Tue", "hours": 6 },
  { "day": "Wed", "hours": 10 },
  { "day": "Thu", "hours": 9 },
  { "day": "Fri", "hours": 8 }
]

JSON_EXTRACT

JSON_EXTRACT 関数は、JSON オブジェクトから個別の値を取得します。次のクエリは、関数の2つ目のアーギュメントとして渡されたJSON パスをベースに値を返します:

SELECT 
  JSON_EXTRACT(days,'[0].day') AS Day,
  JSON_EXTRACT(days,'[0].hours') AS Hours
FROM Employees;

クエリは次のデータを返します:

Day Hours
Mon 2

JSON_SUM

JSON_SUM 関数は、JSON オブジェクト内のJSON 配列の数値の和を返します。次のクエリは、関数の2つ目のアーギュメントとして渡されたJSON パスをベースに値を返します:

SELECT 
  Name, 
  JSON_SUM(hours,'[x].hours') AS TotalHours 
FROM Employees;

クエリは次のデータを返します:

TotalHours
35

JSON

JSON 関数は、ドキュメント全体をJSON 文字列として取得するために使われます。次のクエリ結果を例として見てみましょう。

SELECT 
  JSON(*) 
FROM Employees;

このクエリは、テーブル全体を文字列として返します。

これらのCData ドライバーの機能により、NoSQL のフレキシビリティとRDB の機能を合わせて使うことができます。

製品情報と無償評価版

Apache Cassandra 製品ページ で製品情報を参照できます。 ぜひ、30日の無償評価版 をダウンロードしてご利用ください。

関連コンテンツ

トライアル・お問い合わせ

30日間無償トライアルで、CData のリアルタイムデータ連携をフルにお試しいただけます。記事や製品についてのご質問があればお気軽にお問い合わせください。