【MarkLogic】データを登録してみる（MLCP）

※試用版を使っています。

####参考URL
[Developer Community：Content Pump (mlcp)](https://developer.marklogic.com/products/mlcp)
[UsersGuide　：MLCP](http://docs.marklogic.com/guide/mlcp)
[Release notes：MarkLogic Content Pump and MarkLogic Connector for Hadoop　 （README.md）](https://github.com/marklogic/marklogic-contentpump/blob/master/README.md)
[Loading Content Into MarkLogic](https://docs.marklogic.com/guide/ingestion/encoding)

#MLCPとは
MarkLogic Content Pump。OSSのJava Baseのコマンドラインツール。
MarkLogicデータベースとの間でインポート・エクスポート・コピーを「最速で」実行できる（らしい）。
HadoopのMapReduceフレームワークを拡張したもの（らしい）
入力はファイルシステムまたはHDFS。

#確認すること
1. MLCPの機能
2. 文字コードをUTF-8にしながらロードできるか
3. フォーマットの変更ができるという噂を聞いたので、どこまでやれるのか
4. Gitの更新履歴

##動作要件
- XDBCアプリケーションサーバが構成されているMarkLogicサーバ（7.0以降）
<br>MarkLogic8以降は:8000で事前設定されたXDBC App Serverが付属している
- Oracle / Sun Java JRE 1.8以降

##データフォーマット
取り込む際に、Inputファイルのフォーマットを明示的に指定する。（-input_file_typeオプション）
指定が無い場合は、拡張子を参考して自動判別するようだ。

[Importing Content Into MarkLogic Server（Supported Input Format Summary）](http://docs.marklogic.com/guide/mlcp/import#id_71112)

# 1. MLCPでできること
- バルクロード
- データベースコンテンツのエクスポートする
- データベースの移行
- データベース間で一部のデータをコピーする

#### MLCPの利点（引用）
- データを取り込む仕組みがシンプルになる
- 他のツールや環境といい感じに統合できる
- 取込ワークフローのパフォーマンスが向上する
  - 大規模（サイズ？数）のファイルをバルクロードできる
  - 大規模（サイズ？数）のXMLやCSV、TSVなどをロードできる
  - HDFSからドキュメントをロードできる
  - データノードに直接コンテンツをロードできる
  - データベース間のアーカイブやレストアができる　など。

# 2. UTF-8ではないファイルを読み込む
以前にMarkLogicサーバ管理画面からデータをロードした際は、Shift-JISのデータを弾かれてしまった。
[→　参考：UTF-8でないことを通知され、失敗](https://qiita.com/Cha-Ko/items/2454c22f40958debc680)

MLCPでも、やはりShift-JISのデータをロードするとエラーになり取り込まれない。

```
ERROR mapreduce.ContentWriter: XDMP-DOCUTF8SEQ: Invalid UTF-8 escape sequence at /C:/data/SJIS.csv line 1 -- document is not UTF-8 encoded
```

## 専用オプションの利用<br>
MLCPに文字コード変換系のオプションを発見。

- 日本語訳（想定）
ロード時にMarkLogicが利用する文字コードを指定しろ。デフォルトはUTF-8である（？）
Inputとなるファイルの文字コードを指定しろ。ということなのだろうか。

- 取り込み完了
  どうやら正解らしい。MarkLogicへはUTF-8で登録された想定。
  QueryConsoleからも文字化け無しで参照できた。


```SJIS.csv
mlcp.bat import -host ${hostname} -port ${port} -username ${user} -password ${passwd} -input_file_path ${file_SJIS} -content_encoding Shift-JIS
```

###改行コードについて
あとで書く。UNIX系が基本になっていそう。

# 3. ファイルフォーマット変更

- やりたいこと（できると噂で聞いたので試す）
  - CSV to XML
  - CSV to JSON

以下のオプションを利用して可能。CSVからXMLまたはJSON形式のファイルを生成する。
[Creating Documents from Delimited Text Files](http://docs.marklogic.com/guide/mlcp/import#id_70366)

どうやら、input_file_typeの付与も必須と思ったほうが安全そう。

>-input_file_type delimited_text
-document_type xml or -document_type json

```
mlcp.bat import -host ${hostname} -port ${port} -username ${user} -password ${passwd} -input_file_path ${file} -input_file_type delimited_text -document_type xml
```

利用したデータは相変わらずこちら。[（平成27年度 自動車交通騒音調査結果）
](http://opendata-catalogue.metro.tokyo.jp/dataset/t000009d1800000014)

```ロードしたデータ（抜粋）.csv
一連番号,測定地点の住所,環境基準類型,路線名,緯度,経度,座標系,車線数,道路種別,測定開始年月日,測定終了年月日,車道端からの距離(m),地上高さ(m),等価騒音レベル(ｄＢ)／昼間,等価騒音レベル(ｄＢ)／夜間
1,千代田区麹町4丁目5-20,C,国道20号（新宿通り）,35.683782,139.736748,JGD2011,8,3,2015-12-17,2015-12-18,6.2,1.2,67,65
```

XMLに変換された！！

```ロードされたデータ（抜粋）.xml
<?xml  version="1.0" encoding="UTF-8"?>
<root>
<一連番号>1</一連番号>
<測定地点の住所>千代田区麹町4丁目5-20</測定地点の住所>
<環境基準類型>C</環境基準類型>
<路線名>国道20号（新宿通り）</路線名>
<緯度>35.683782</緯度>
<経度>139.736748</経度>
<座標系>JGD2011</座標系>
<車線数>8</車線数>
<道路種別>3</道路種別>
<測定開始年月日>2015-12-17</測定開始年月日>
<測定終了年月日>2015-12-18</測定終了年月日>
<車道端からの距離_m_>6.2</車道端からの距離_m_>
<地上高さ_m_>1.2</地上高さ_m_>
<等価騒音レベル_ｄＢ_／昼間>67</等価騒音レベル_ｄＢ_／昼間>
<等価騒音レベル_ｄＢ_／夜間>65</等価騒音レベル_ｄＢ_／夜間>
</root>
```

「-document_type json」の結果

```
{
"一連番号": "1", 
"測定地点の住所": "千代田区麹町4丁目5-20", 
"環境基準類型": "C", 
"路線名": "国道20号（新宿通り）", 
"緯度": "35.683782", 
"経度": "139.736748", 
"座標系": "JGD2011", 
"車線数": "8", 
"道路種別": "3", 
"測定開始年月日": "2015-12-17", 
"測定終了年月日": "2015-12-18", 
"車道端からの距離(m)": "6.2", 
"地上高さ(m)": "1.2", 
"等価騒音レベル(ｄＢ)／昼間": "67", 
"等価騒音レベル(ｄＢ)／夜間": "65"
}
```

# Gitの更新履歴

Issueの回答率も低くなく、比較的安定していそう。
とりあえず問題なく使えそう。

以上