ヘッダーをスキップ
Oracle® Big Data Connectorsユーザーズ・ガイド
リリース2 (2.5)
E53261-01
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

JSONファイル・アダプタ

JSONファイル・アダプタは、HDFSに格納されたJSONファイルへのアクセスを提供します。他のファイル形式で埋め込まれているJSONデータを処理するための関数も含まれています。たとえば、大規模なテキスト・ファイルに行として格納されているJSONを問い合せるには、json:parse-as-xmlおよびtext:collection関数を使用します。

現在、単一のJSONファイルの並列処理はサポートされていません。一連のJSONファイルの並列処理は、各ファイルを順次処理して行うことができます。

JSONモジュールについては、次のトピックを参照してください。

JSONを読み取る組込み関数

問合せで組込み関数を使用するには、次のようにJSONファイル・モジュールをインポートする必要があります。

import module "oxh:json";

JSONモジュールには、次の関数が含まれています。

json:collection-jsonxml

HDFS内のJSONファイルのコレクションにアクセスします。複数のファイルを同時に処理できますが、個々のファイルは1つのタスクによって解析されます。

Hadoopでサポートされている圧縮コーデックを使用して圧縮されたファイルは、JSONファイル・アダプタによって自動的に解凍されます。

シグネチャ

json:collection-jsonxml($uris as xs:string*) as element()* external;

パラメータ

$uris: JSONファイルのURI

戻り値

JSON値をモデル化するXML要素。「XMLへのJSONデータ形式の変換について」を参照してください。

json:parse-as-xml

JSON値をXMLとして解析します。

シグネチャ

json:parse-as-xml($arg as xs:string?) as element(*)?

パラメータ

$arg: 空の順序を指定できます。

戻り値

JSON値をモデル化するXML要素。$argが空の順序の場合は、空の順序です。「XMLへのJSONデータ形式の変換について」を参照してください。

json:get

XMLとしてモデル化されたJSONオブジェクトからエントリを取得します。「XMLへのJSONデータ形式の変換について」を参照してください。

シグネチャ

json:get($key as xs:string?, $obj as node()?) as element(oxh:entry)?

json:get($key as xs:string?) as element(oxh:entry)?

パラメータ

$key: JSONデータ・キー

$obj: JSONオブジェクト値

戻り値

次のXPath式の値。

$obj/oxh:entry[@key eq $key]

$inputが存在しない場合、動作は、2つの引数の関数を呼び出して$objのコンテキスト項目を使用するのと同じです。「注意」を参照してください。

注意

次の関数呼出しは同等です。

$var/json:get("key")

json:get("key", $var)

$var/oxh:entry[@key eq "key"]
 

$varは、XMLとしてモデル化されたJSONオブジェクトです。「マップの読取り」を参照してください。

JSONファイルを読み取るカスタム関数

次の注釈を使用して、HDFS内のJSONファイルのコレクションを読み取る関数を定義できます。これらの注釈によって、組込み関数では使用できない追加機能を使用できます。

シグネチャ

JSONファイルを読み取るカスタム関数には、次のシグネチャが必要です。

declare %json:collection("jsonxml") [additional annotations]
   function local:myFunctionName($uris as xs:string*) as element()* external;

注釈

%json:collection("jsonxml")

collection関数を宣言します。注釈パラメータはjsonxmlである必要があります。

%output:encoding("charset")

入力ファイルのテキスト・エンコードを識別します。

有効なエンコードは、JVMでサポートされているエンコードです。この注釈を省略すると、エンコードは、UTF-8、UTF-16のビッグエンディアン・シリアライズ(BE)またはリトルエンディアン・シリアライズ(LE)、UTF-32 (BEまたはLE)としてJSONファイルから自動的に検出されます。

パフォーマンスを向上させるには、次のInternet Engineering Task Force (IETF)のWebサイトにある『JSON Request for Comment 4627』のエンコードに関する項に従って実際のファイル・エンコードを指定する場合に、エンコードの注釈を省略します。

http://www.ietf.org/rfc/rfc4627.txt

パラメータ

$uris as xs:string*

JSONファイルのURIをリストします。必須。

戻り値

XML要素のコレクション。各要素は対応するJSON値をモデル化します。「XMLへのJSONデータ形式の変換について」を参照してください。

JSON関数の例

例1では、HDFSに格納されている次のJSONテキスト・ファイルを使用します。

mydata/users1.json
[
{ "user" : "john", "full name" : "John Doe", "age" : 45 },
{ "user" : "kelly", "full name" : "Kelly Johnson", "age" : 32 }
]
 
mydata/users2.json 
[
{ "user" : "laura", "full name" : "Laura Smith", "age" : null },
{ "user" : "phil", "full name" : "Phil Johnson", "age" : 27 }
]
 

残りの例では、HDFS内の次のテキスト・ファイルを問い合せます。

mydata/users-json.txt
 
{ "user" : "john", "full name" : "John Doe", "age" : 45 }
{ "user" : "kelly", "full name" : "Kelly Johnson", "age" : 32 }
{ "user" : "laura", "full name" : "Laura Smith", "age" : null }
{ "user" : "phil", "full name" : "Phil Johnson", "age" : 27 }
例1   

次の問合せは、姓がJohnsonであるユーザーの名前をusers1.jsonおよびusers2.jsonから選択します。

import module "oxh:text";
import module "oxh:json";
 
for $user in json:collection-jsonxml("mydata/users*.json")/oxh:item
let $fullname := $user/json:get("full name")
where tokenize($fullname, "\s+")[2] eq "Johnson"
return 
   text:put-text($fullname)

この問合せは、次の行を含むテキスト・ファイルを生成します。

Phil Johnson
Kelly Johnson
例2   

次の問合せは、30歳を超えるユーザーの名前をusers-json.txtから選択します。

import module "oxh:text";
import module "oxh:json";

for $line in text:collection("mydata/users-json.txt")
let $user := json:parse-as-xml($line)
where $user/json:get("age") gt 30
return 
   text:put($user/json:get("full name"))

この問合せは、次の行を含むテキスト・ファイルを生成します。

John Doe
Kelly Johnson
例3   

次の問合せは、age値がnullの従業員の名前をusers-json.txtから選択します。

import module "oxh:text";
import module "oxh:json";

for $line in text:collection("mydata/users-json.txt")
let $user := json:parse-as-xml($line)
where $user/json:get("age")/nilled()
return 
   text:put($user/json:get("full name"))
 

この問合せは、次の行を含むテキスト・ファイルを生成します。

Laura Smith

JSONファイル・アダプタの構成プロパティ

Oracle XQuery for Hadoopでは、構成プロパティを指定する汎用オプションをhadoopコマンドで使用します。構成ファイルを指定する場合は-confオプションを使用し、個別のプロパティを指定する場合は-Dオプションを使用します。「問合せの実行」を参照してください。

次の構成プロパティは、同じ名前のJacksonパーサー・オプションと同等です。オプション名は、大文字で入力しても小文字で入力してもかまいません。たとえば、oracle.hadoop.xquery.json.parser.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTERoracle.hadoop.xquery.json.parser.allow_backslash_escaping_any_characterは同じです。

oracle.hadoop.xquery.json.parser.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER

型: Boolean

デフォルト値: false

説明: 文字をバックスラッシュ(\)でエスケープできます。それ以外の場合は、次の文字のみをエスケープできます: 引用符(")、スラッシュ(/)、バックスラッシュ(\)、バックスペース、フォーム・フィード(f)、改行(n)、キャリッジ・リターン(r)、水平タブ(t)および16進表現(unnnn)。

oracle.hadoop.xquery.json.parser.ALLOW_COMMENTS

型: Boolean

デフォルト値: false

説明: 解析されたテキスト内でJavaおよびC++のコメント(/* and //)を使用できます。

oracle.hadoop.xquery.json.parser.ALLOW_NON_NUMERIC_NUMBERS

型: Boolean

デフォルト値: false

説明: 非数(NaN)トークンを浮動小数点値として解析できます。

oracle.hadoop.xquery.json.parser.ALLOW_NUMERIC_LEADING_ZEROS

型: Boolean

デフォルト値: false

説明: 整数値を、00001などゼロで始めることができます。ゼロによって値が変わることはなく、ゼロは無視できます。

oracle.hadoop.xquery.json.parser.ALLOW_SINGLE_QUOTES

型: Boolean

デフォルト値: false

説明: 一重引用符(')で文字列値を区切ることができます。

oracle.hadoop.xquery.json.parser.ALLOW_UNQUOTED_CONTROL_CHARS

型: Boolean

デフォルト値: false

説明: JSON文字列に引用符で囲まれていない制御文字(つまり、タブやライン・フィードなど、32未満の10進値であるASCII文字)を含めることができます。

oracle.hadoop.xquery.json.parser.ALLOW_UNQUOTED_FIELD_NAMES

型: Boolean

デフォルト値: false

説明: 引用符で囲まれていないフィールド名を使用できます。これは、JSON仕様ではなく、Javascriptによって許可されます。

XMLへのJSONデータ形式の変換について

この項では、JSONデータ形式がどのようにXMLに変換されるかについて説明します。この項の内容は次のとおりです。

JSONオブジェクトからXMLへの変換について

JSONオブジェクトはAvroマップに似ており、同じXML構造に変換されます。「マップの読取り」を参照してください。

たとえば、次のJSONオブジェクトがXML要素に変換されます。

{ 
   "user" : "john", 
   "full_name" : "John Doe", 
   "age" : 45 
}

オブジェクトは次の要素としてモデル化されます。

<oxh:item>
    <oxh:entry key="user">john</oxh:entry>
    <oxh:entry key="full_name">John Doe</oxh:entry>
    <oxh:entry key="age">45</oxh:entry>
</oxh:item>

JSON配列からXMLへの変換について

JSON配列はAvro配列に似ており、同じXML構造に変換されます。「配列の読取り」を参照してください。

たとえば、次のJSON配列がXML要素に変換されます。

[ "red", "blue", "green" ]

配列は次の要素としてモデル化されます。

<oxh:item>
   <oxh:item>red</oxh:item>
   <oxh:item>blue</oxh:item>
   <oxh:item>green</oxh:item>
</oxh:item>

他のJSONタイプの変換について

他のJSON値は、表6-2に示すようにマップされます。

表6-2 JSONタイプの変換

JSON XML

null

空(nilled)の要素

true/false

xs:boolean

number

xs:decimal

string

xs:string