グローバルなエンタープライズアプリケーションを構築するということは、多様な言語と一貫性のないデータ入力を扱うことを意味します。データベースはどのようにしてドイツ語で "Äpfel" を "Apfel" の後に並べ替えたり、フランス語で "ç" を "c" として扱ったりするのでしょうか?また、ユーザーが "John Smith" と入力した場合と "john smith" と入力した場合をどのように扱い、それらが同一であるかどうかを判断するのでしょうか?
コレーション(照合順序)は、テキストのソートや比較に関するルールを定義することでデータ処理を効率化し、言語や大文字小文字の敏感さを考慮した処理を実現します。コレーションにより、データベースは言語や文脈を認識し、ユーザーの期待通りにテキストを処理できるようになります。
私たちは、コレーションがDatabricks Runtime 16.1でパブリックプレビューとして利用可能になったことをお知らせできることを嬉しく思います(近日中にDatabricks SQL Preview Channel 2024.50バージョンおよびDatabricks Delta Live Tablesにも登場予定です)。コレーションは、ケースセンシティビティ(大文字小文字の区別)やアクセントセンシティビティ(アクセントの有無)など、特定の言語要件に合わせた文字列比較ルールを定義するための仕組みを提供します。
このブログでは、コレーションの仕組み、重要性、そしてニーズに合ったコレーションを選択する方法について詳しく見ていきます。
コレーションを使うことで、ユーザーは100を超える言語固有の照合順序ルールから選択し、データワークフローに実装できます。これにより、ソート、検索、マルチリンガルなテキストデータセットの結合などの操作が簡素化されます。 コレーションのサポートにより、レガシーデータベースシステムからの移行時にも同じルールを適用しやすくなります。この機能は、ケースインセンシティブ(大文字小文字を区別しない)およびアクセントインセンシティブ(アクセントを区別しない)な比較を必要とする一般的なクエリにおいて、パフォーマンスの向上とコードの簡素化を実現します。
Databricksのコレーションサポートには以下の機能が含まれます:
コレーションサポートは完全にオープンソースで、Apache Spark™およびDelta Lakeに統合されています。
コレーションは、確立されたSparkの機能と強力に統合されており、結合、集約、ウィンドウ関数、フィルターなどの操作がコレーションされたデータでシームレスに機能します。ほとんどの文字列式はコレーションと互換性があり、CONTAINS
、STARTSWITH
、REPLACE
、TRIM
など、さまざまな式で使用できます。詳細はコレーションのドキュメンテーションをご覧ください。
コレーションを使い始めるには、適切なコレーションでテーブルの列を作成(または変更)します。例えば、ギリシャ語の名前の場合、EL_AI
コレーションを使用します。EL
はギリシャ語の言語識別子で、AI
はアクセントを区別しないことを意味します。英語の名前(アクセントがない場合)には、UTF8_LCASE
を使用します。
コレーションによって可能になるシナリオを示すために、以下のタスクを実行します:
これらを、ホメロスの『イリアス』から取ったギリシャ語と英語の英雄の名前が含まれるテーブルを使って示します。
利用可能なすべてのコレーションを一覧表示するには、次のクエリを実行します:SELECT * FROM collations()
ALTER
コマンドの後に ANALYZE
コマンドを実行することで、その後のクエリがデータスキップを活用できることを確認してください。
これからは、英語の名前を明示的に比較する前に LOWER
を使う必要はありません。ファイルのプルーニングも内部で自動的に行われます。
ギリシャ語の言語ルールに従ってソートするには、単純に ORDER BY
を使用できます。EL_AI
コレーションを使用しない場合とは結果が異なることに注意してください。
そして、アクセントを区別せずに検索する場合、例えばアガメムノン(またはギリシャ語で Ἀγαμέμνων)に関連するすべての行を検索するには、アクセント付きのギリシャ語の名前と一致するフィルターを適用するだけです:
コレーションのサポートにより、大文字と小文字を区別しない結果を得るための高コストな操作を行う必要がなくなり、プロセスが合理化され、効率が向上します。
以下のグラフは、大文字と小文字を区別しない結果を得るためにLOWER SQL関数とコレーションのサポートを使用した実行時間を比較しています。比較は1Bのランダムに生成された文字列で行われました。クエリは、ある列「col」で、大文字と小文字を区別しない方法で「abc」に等しいすべての文字列をフィルタリングすることを目指しています。レガシーのUTF8_BINARYコレーションが使用されるシナリオでは、フィルタ条件はLOWER(col) == ‘abc’です。列「col」がUTF8_LCASEコレーションでコレートされると、フィルタ条件は単にcol == ‘abc’となり、同じ結果が得られます。コレーションを使用すると、Deltaファイルのスキップを活用してクエリの実行が最大22倍速くなります。(この場合、Photonはどちらのクエリでも使用していません)
Photonを使用すると、パフォーマンスがさらに向上する可能性があります。(実際の速度はコレーション、関数、データによって異なります)。
下記のグラフは、UTF8_LCASE
コレーションを使用した場合の、等価比較、STARTSWITH
、ENDSWITH
、CONTAINS
のSQL関数について、Photonありとなしの速度を比較したものです。これらの関数は、ランダムに生成されたASCII文字のみの1000文字の文字列データセットで実行されました。この例では、STARTSWITH
と ENDSWITH
の関数は、コレーションを使用した際に10倍のパフォーマンス向上が見られました。
Photon最適化実装を除き、すべてのコレーション機能はオープンソースのSparkでも利用可能です。データフォーマットに変更はなく、データは基盤となるファイルでUTF-8エンコードのままで保存されます。すべての機能はオープンソースのSparkとDelta Lakeの両方でサポートされており、これにより顧客はコードをポータブルとして扱え、Sparkエコシステム全体で移行可能です。
近い将来、顧客はコレーションをカタログ、スキーマ、またはテーブルレベルで設定できるようになります。さらに、RTRIM
(不要な末尾の空白を無視するための文字列比較機能)のサポートも近日中に追加される予定です。最新情報については、Databricksのホームページや「What's Coming」ドキュメントページで更新情報をチェックしてください。
コレーションの使用を始めるには、Databricksのドキュメンテーションを参照してください。
Databricks SQLについて詳しく知りたい場合は、公式ウェブサイトやドキュメンテーションをご覧ください。また、Databricks SQLの製品ツアーもチェックできます。既存のデータウェアハウスを、高性能でサーバーレスのデータウェアハウスに移行し、優れたユーザー体験と低コストを実現したい場合、Databricks SQLが最適です。無料で試してみてください。