データ型の検出

データ処理によってHive表からデータが取得されると、データがDgraphに収集されるときにHiveデータ型がDgraphデータ型にマップされます。

ワークフローの検出フェーズは、データ処理により、Dgraphの属性スキーマを決定するためにデータ・セット・メタデータを検出することを意味します。データ処理では、特定のHive表列のデータ型を確定できたら、このHive列のデータ型をDgraph属性データ型にマップできるようになります。

HiveからDgraphへのデータ変換

Hive表が作成されると、列ごとにデータ型が指定されます(BOOLEANDOUBLEなど)。データ処理ワークフローでは、Hive列ごとにDgraph属性が作成されます。作成される属性のDgraphデータ型は、Hive列のデータ型に基づいています。Dgraphレコードとは何か、およびDgraph属性とは何かに関する情報を含むデータ・モデルの詳細は、「Dgraphデータ・モデル」の項を参照してください。

次の表に、サポートされているHiveデータ型からDgraphデータ型へのマッピングをリストします。リストされていないHiveデータ型はデータ処理ではサポートされておらず、その列内のデータはプロビジョニングされません。
Hiveデータ型 Hive説明 Dgraphデータ型への変換
ARRAY<data_type> Hiveデータ型の値の配列(ARRAY<STRING>など)。 mdex:data_type-set

data_typeは、この列内のDgraphデータ型です。これらの-setデータ型は、複数割当属性用です(mdex:string-setなど)。

BIGINT 8バイトの符号付き整数。 mdex:long
BOOLEAN TRUEまたはFALSE mdex:boolean
CHAR 固定長の文字列(最大長は255)。 mdex:string
DATE 次のフォームで特定の年/月/日を表します。
YYYY-MM-DD
データ型には時刻構成要素はありません。サポートされる値の範囲は0000-01-01から9999-12-31です。
mdex:dateTime
DECIMAL 38桁の精度の数値。 mdex:double
DOUBLE 8バイトの(倍精度)浮動小数点数。 mdex:double
FLOAT 4バイトの(単精度)浮動小数点数。 mdex:double
INT 4バイトの符号付き整数。 mdex:long
SMALLINT 2バイトの符号付き整数。 mdex:long
STRING 最大32,767バイトの文字列値。 mdex:string

値の100%が実際には別のデータ書式(longやdateTimeなど)である場合、文字列列はDgraphの文字列以外のデータ型としてマップできます。

TIMESTAMP ある時点を表し、オプションとしてナノ秒の精度を設定できます。使用可能な日付値の範囲は、1400-01-01から9999-12-31までです。 mdex:dateTime
TINYINT 1バイトの符号付き整数。 mdex:long
VARCHAR 長さの指定子を持つ文字列(1から65355まで)。 mdex:string

Hive文字列列のデータ型の検出

STRING以外のデータ型でHive列が構成されている場合、データ処理では、この列内のレコード値の書式は有効であると見なされます。この場合、この列から導出されたDgraph属性では、上記の表にリストされているマップ済のDgraphデータ型が自動的に使用されます。

ただし、文字列列には、実際には文字列ではないデータが使用されることが多々あります(たとえば、整数が文字列として格納されることがあります)。データ処理では、Hive表の文字列列のコンテンツを分析する際に、次のアルゴリズムを使用して、各列に実際に格納されているデータの型の確認を行います。
  • 列値の100%が特定の1つのタイプである場合、これらの列値はDgraphの等価データ型(上記の表を参照)としてDgraphに収集されています。
  • 列内のデータ型が混在している(整数と日付など)場合、その列のDgraphデータ型はstring (mdex:string)です。このルールの唯一の例外は、列内で整数と倍精度浮動小数点(または浮動小数点)が混在している場合です。この場合、データ型はmdex:doubleにマップされます(なぜなら、整数は倍精度浮動小数点として収集できますが、この逆は不可能であるからです)。

たとえば、データ処理ディスカバラにより、特定の文字列列に実際に地域コードが含まれると判断された場合(列値の100%が適切な地域コードであるため)、これらの地域コード値はDgraphのmdex:geocodeデータ型として収集されます。ただし、列値の95%が地域コードであるが、他の5%が別のデータ型である場合、この列のデータ型はDgraphのmdex:stringデータ型にデフォルト設定されます。ただし、科学的記数法("1.4E-4"など)で表示される倍精度浮動小数点値は、倍精度浮動小数点ではなく文字列として評価されます。

もう1つ例を挙げると、Hive文字列列の100%が整数値で構成されている場合、これらの値はDgraphのmdex:longデータ型として収集されます。有効な整数書式はすべて受け入れられます("10"、"-10"、"010"および"+10"など)。

スペース埋込み値

スペースが埋め込まれたHive値は、次のように処理されます。
  • スペースを含む整数はすべて文字列(mdex:string)に変換されます。
  • スペースを含む倍精度浮動小数点は文字列(mdex:string)に変換されます。
  • スペースを含むブールは文字列(mdex:string)に変換されます。
  • 地域コードは、スペースが埋め込まれていても影響を受けません。
  • 日付/時間/タイムスタンプは、スペースが埋め込まれていても影響を受けません。

サポートされている地域コード書式

次のHive地域コード書式は、検出フェーズ中にサポートされ、Dgraphのmdex:geocodeデータ型にマップされます。
Latitude Longitude
Latitude, Longitude
(Latitude Longitude)
(Latitude, Longitude)
次に例を示します。
40.55467767 -54.235
40.55467767, -54.235
(40.55467767 -54.235)
(40.55467767, -54.235)

カンマ区切り書式の場合、カンマの後ろにスペースが必要です。

これらの地域コード書式が列データ内で検出された場合、その値は地域コード(mdex:geocode)属性としてDgraphに収集されます。

サポートされている日付書式

DATE値としてHive表に格納された日付は、収集対象として有効な日付であると見なされます。これらのDATE値は、Dgraphのmdex:dateTimeデータ型として収集されます。

文字列としてHive表に格納された日付の場合、サポートされている日付書式のリストに対してチェックされます。文字列型の日付がサポートされている日付書式と一致した場合、これはmdex:dateTimeデータ型として収集されます。データ処理によってサポートされている日付書式は、dateFormats.txtファイルにリストされています。このファイルの詳細は、トピック「日付書式構成」を参照してください。

また、データ処理では、文字列列内の各日付が有効であるかどうかも検証されます。日付が有効でない場合、この列は日付列ではなく文字列列であると見なされます。

Hive列の日付がDgraph日付に変換される例を挙げると、次のHive日付値は、
2013-10-23 01:23:24.1234567
次のDgraph dateTime値に変換されます。
2013-10-23T05:23:24.123Z

日付は、Dgraphのmdex:dateTimeデータ型として収集されます。

タイムスタンプのサポート

HiveのTIMESTAMP値は有効な日付であると見なされ、Dgraphのmdex:dateTimeデータ型として収集されます。したがって、これらの書式はdateFormats.txtファイル内の書式に対してチェックされません。

HiveのTIMESTAMP値は、Studio内で表示される場合、(その列内の値に時間があるかどうかに応じて) "yyyy-MM-dd"または"yyyy-MM-dd HH:mm:ss"として書式設定されます。

Hiveのタイムスタンプ列内のすべての値が同じ書式でない場合、Dgraphレコード内の時間部分はゼロになります。たとえば、Hive列に次の値が含まれるとします。
2013-10-23 01:23:24
2012-09-22 02:24:25
両方のタイムスタンプが同じ書式であるため、Dgraphレコード内で作成される対応する値は、次のようになります。
2013-10-23T01:23:24.000Z
2012-09-22T02:24:25.000Z
ここで、時間部分のない3番目の行がこのHive表に挿入されるとします。この時点で、Hive列には次が含まれます。
2013-10-23 01:23:24
2012-09-22 02:24:25
2007-07-23
この場合、Dgraphレコードの時間部分(mdex:dateTime値)はゼロになります。
2013-10-23T00:00:00.000Z
2012-09-22T00:00:00.000Z
2007-07-23T00:00:00.000Z

このようになるのは、入力データ内に異なる日付書式が含まれる場合、すべての値と一致する、より一般的な書式が選択されるため、より具体的な時間情報を持つ値が一部の情報を失う可能性があるからです。

もう1つ例を挙げると、パターン"yyyy-MM-dd"の場合、"2001-01-01"と"2001-01-01 12:30:23"の両方を解析できます。ただし、"yyyy-MM-dd hh:mm:ss"のようなパターンの場合、短い文字列である"2001-01-01"に適用されると、エラーがスローされます。したがって、"2001-01-01"と"2001-01-01 12:30:23"の両方と一致できる"yyyy-MM-dd"が、最適な(最も使用可能範囲の広い)選択肢として選択されます。選択されたパターンには時間が含まれていないため、精度は下がります。