JSONファイル・アダプタは、HDFSに格納されたJSONファイルへのアクセスを提供します。他のファイル形式で埋め込まれているJSONデータを処理するための関数も含まれています。たとえば、大規模なテキスト・ファイルに行として格納されているJSONを問い合せるには、json:parse-as-xml
およびtext:collection
関数を使用します。
現在、単一のJSONファイルの並列処理はサポートされていません。一連のJSONファイルの並列処理は、各ファイルを順次処理して行うことができます。
JSONモジュールについては、次のトピックを参照してください。
問合せで組込み関数を使用するには、次のようにJSONファイル・モジュールをインポートする必要があります。
import module "oxh:json";
JSONモジュールには、次の関数が含まれています。
HDFS内のJSONファイルのコレクションにアクセスします。複数のファイルを同時に処理できますが、個々のファイルは1つのタスクによって解析されます。
Hadoopでサポートされている圧縮コーデックを使用して圧縮されたファイルは、JSONファイル・アダプタによって自動的に解凍されます。
シグネチャ
json:collection-jsonxml($uris as xs:string*) as element()* external;
パラメータ
$uris
: JSONファイルのURI
戻り値
JSON値をモデル化するXML要素。「XMLへのJSONデータ形式の変換について」を参照してください。
JSON値をXMLとして解析します。
シグネチャ
json:parse-as-xml($arg as xs:string?) as element(*)?
パラメータ
$arg
: 空の順序を指定できます。
戻り値
JSON値をモデル化するXML要素。$arg
が空の順序の場合は、空の順序です。「XMLへのJSONデータ形式の変換について」を参照してください。
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オブジェクトです。「マップの読取り」を参照してください。
次の注釈を使用して、HDFS内のJSONファイルのコレクションを読み取る関数を定義できます。これらの注釈によって、組込み関数では使用できない追加機能を使用できます。
シグネチャ
JSONファイルを読み取るカスタム関数には、次のシグネチャが必要です。
declare %json:collection("jsonxml") [additional annotations] function local:myFunctionName($uris as xs:string*) as element()* external;
注釈
collection関数を宣言します。注釈パラメータはjsonxml
である必要があります。
入力ファイルのテキスト・エンコードを識別します。
有効なエンコードは、JVMでサポートされているエンコードです。この注釈を省略すると、エンコードは、UTF-8、UTF-16のビッグエンディアン・シリアライズ(BE)またはリトルエンディアン・シリアライズ(LE)、UTF-32 (BEまたはLE)としてJSONファイルから自動的に検出されます。
パフォーマンスを向上させるには、次のInternet Engineering Task Force (IETF)のWebサイトにある『JSON Request for Comment 4627』のエンコードに関する項に従って実際のファイル・エンコードを指定する場合に、エンコードの注釈を省略します。
例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 }
次の問合せは、姓が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
次の問合せは、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
次の問合せは、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
Oracle XQuery for Hadoopでは、構成プロパティを指定する汎用オプションをhadoop
コマンドで使用します。構成ファイルを指定する場合は-conf
オプションを使用し、個別のプロパティを指定する場合は-D
オプションを使用します。「問合せの実行」を参照してください。
次の構成プロパティは、同じ名前のJacksonパーサー・オプションと同等です。オプション名は、大文字で入力しても小文字で入力してもかまいません。たとえば、oracle.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進表現(u
nnnn
)。
型: Boolean
デフォルト値: false
説明: 解析されたテキスト内でJavaおよびC++のコメント(/* and //)を使用できます。
型: Boolean
デフォルト値: false
説明: 非数(NaN)トークンを浮動小数点値として解析できます。
型: Boolean
デフォルト値: false
説明: 整数値を、00001などゼロで始めることができます。ゼロによって値が変わることはなく、ゼロは無視できます。
型: Boolean
デフォルト値: false
説明: 一重引用符(')で文字列値を区切ることができます。
型: Boolean
デフォルト値: false
説明: JSON文字列に引用符で囲まれていない制御文字(つまり、タブやライン・フィードなど、32未満の10進値であるASCII文字)を含めることができます。
型: Boolean
デフォルト値: false
説明: 引用符で囲まれていないフィールド名を使用できます。これは、JSON仕様ではなく、Javascriptによって許可されます。
この項では、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配列は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>