SPARK SQL でTSVファイルをHDFSからロードしてSHOWするだけ。


SPARK SQL でTSVファイルをHDFSからロードしてSHOWするだけ。

前提とか

  • SPARKは1.6.0
  • 実行はspark-shellから行う
  • --master yarn-clientで起動
  • hdfsは設定済(spark-env.shにHADOOP_CONF_DIR設定済)
  • データは国会図書館の全国書誌(電子書籍・電子雑誌編)TSVファイル一覧(以下の)サイトのものを使用する
    http://www.ndl.go.jp/jp/data/data_service/jnb/ebej_tsv.html

1.TSVファイルをダウンロードしてhdfsに配置する

shell
$ wget http://iss.ndl.go.jp/data/download/digital_20160122.tsv
$ sudo -i -u hdfs hdfs dfs -put /home/junk/digital_20160122.tsv /home/junk

コピー先の/home/junkは先に作成しておく。chmodでアクセス権限も与えておく。
hdfsコマンドで使用する環境変数の関係で、引数に-iを使ってます。

2.spark-shell起動

shell
$ /usr/local/spark/bin/spark-shell --master yarn-client
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 1.6.0
      /_/

Using Scala version 2.10.5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_72)
Type in expressions to have them evaluated.
Type :help for more information.
scala>

3.実行

spark-shell
scala>//tsvファイルをロード
scala>val bookRDD = sc.textFile("/home/junk/digital_20160120.tsv")
scala>//case class定義
scala>case class Book(NDL_URL: String, ISBN: String, SET_ISBN: String, ISSN: String, ISSN_L: String, DOI: String,
                NDLIP: String, TITLE: String, NEXT_PART: String, PART_NAME: String, ANOTHER_NAME: String,
                SERIES_TITLE: String, EDITION: String, AUTHOR: String, PUB: String, PLACE: String, PUB_DATE: String,
                DATE_RECEIPT: String, TABLE_CONT: String, NOTE: String, LANG: String)
scala>
scala>//DataFrameとスキーマ設定
scala>val bookDF = bookRDD.map { record =>
         val splitRecord = record.split("\t",-1)
         val NDL_URL = splitRecord(0)
         val ISBN = splitRecord(1)
         val SET_ISBN = splitRecord(2)
         val ISSN = splitRecord(3)
         val ISSN_L = splitRecord(4)
         val DOI = splitRecord(5)
         val NDLIP = splitRecord(6)
         val TITLE = splitRecord(7)
         val NEXT_PART = splitRecord(8)
         val PART_NAME = splitRecord(9)
         val ANOTHER_NAME = splitRecord(10)
         val SERIES_TITLE = splitRecord(11)
         val EDITION = splitRecord(12)
         val AUTHOR = splitRecord(13)
         val PUB = splitRecord(14)
         val PLACE = splitRecord(15)
         val PUB_DATE = splitRecord(16)
         val DATE_RECEIPT = splitRecord(17)
         val TABLE_CONT = splitRecord(18)
         val NOTE = splitRecord(19)
         val LANG = splitRecord(20)
         Book(NDL_URL, ISBN, SET_ISBN, ISSN, ISSN_L, DOI, NDLIP, TITLE, NEXT_PART, PART_NAME, 
         ANOTHER_NAME, SERIES_TITLE, EDITION, AUTHOR, PUB, PLACE, PUB_DATE, DATE_RECEIPT,
         TABLE_CONT, NOTE, LANG)
    }.toDF
scala>// 一時テーブルに!
scala>bookDF.registerTempTable("bookdata")
scala>// selectしてみる
scala>val bookCountDF = sqlContext.sql("SELECT * FROM bookdata") 
scala>// selectの結果を表示する
scala>bookCountDF.show
+--------------------+----+--------+----+------+---+--------------------+--------------------+---------+---------+--------------------+------------+-------+--------------------+-------------------+-----+---------------+--------------------+----------+--------------------+--------------+
|             NDL_URL|ISBN|SET_ISBN|ISSN|ISSN_L|DOI|               NDLIP|               TITLE|NEXT_PART|PART_NAME|        ANOTHER_NAME|SERIES_TITLE|EDITION|              AUTHOR|                PUB|PLACE|       PUB_DATE|        DATE_RECEIPT|TABLE_CONT|                NOTE|          LANG|
+--------------------+----+--------+----+------+---+--------------------+--------------------+---------+---------+--------------------+------------+-------+--------------------+-------------------+-----+---------------+--------------------+----------+--------------------+--------------+
|     NDLサーチ書誌詳細画面URL|ISBN| セットISBN|ISSN|ISSN-L|DOI|               NDLJP|                タイトル|  巻次・部編番号|      部編名|               別タイトル|    シリーズタイトル|      版|                  著者|                出版者|  出版地|出版年月日(W3CDTF形式)|       受理日(W3CDTF形式)|        目次|                  注記|言語(ISO639-2形式)|
|http://iss.ndl.go...|    |        |    |      |   |info:ndljp/pid/96...|西遠地域工業用水源地域調査報告(補...|         |         |Areal investigati...|            |       |        尾崎次男 ; 小谷野長平|産業技術総合研究所地質調査総合センター|   日本|           1955|2016-01-20T23:44:40Z|          |                    |           jpn|
|http://iss.ndl.go...|    |        |    |      |   |info:ndljp/pid/96...|愛媛県西条市の工業用水源確保に関する考察|         |         |Hydro-geological ...|            |       |         野間泰二 ; 村下敏夫|産業技術総合研究所地質調査総合センター|   日本|           1963|2016-01-20T23:44:40Z|          |                    |           jpn|
|http://iss.ndl.go...|    |        |    |      |   |info:ndljp/pid/96...|               県民だより|    平成25年|         |                    |            |       |              長崎県広報課|                長崎県|   日本|        2013-11|2016-01-20T22:00:11Z|          |                    |           jpn|
|http://iss.ndl.go...|    |        |    |      |   |info:ndljp/pid/96...|Journal of the Na...|       55|         |                    |            |       |National Institut...|           情報通信研究機構|   日本|           2008|2016-01-20T20:30:20Z|          |Special issue on ...|           eng|
|http://iss.ndl.go...|    |        |    |      |   |info:ndljp/pid/96...|  宮崎県南部地区放射能強度分布調査報告|         |         |Radiometric surve...|            |       |                清島信之|産業技術総合研究所地質調査総合センター|   日本|           1966|2016-01-20T23:44:40Z|          |                    |           jpn|
|http://iss.ndl.go...|    |        |    |      |   |info:ndljp/pid/96...|      長野県西筑摩郡下の放射能調査|         |         |Report on the rad...|            |       |         林昇一郎 ; 丸山修司|産業技術総合研究所地質調査総合センター|   日本|           1962|2016-01-20T23:44:40Z|          |                    |           jpn|
|http://iss.ndl.go...|    |        |    |      |   |info:ndljp/pid/96...|   長野県諏訪ガス田におけるコアー試験|         |         |On the core analy...|            |       |        本島公司 ; 品田芳二郎|産業技術総合研究所地質調査総合センター|   日本|           1955|2016-01-20T23:44:40Z|          |                    |           jpn|
|http://iss.ndl.go...|    |        |    |      |   |info:ndljp/pid/96...|   熊本県綠川水系堰堤地点地質調査報告|         |         |Geology of the da...|            |       |                稻井信雄|産業技術総合研究所地質調査総合センター|   日本|           1957|2016-01-20T23:44:40Z|          |                    |           jpn|
|http://iss.ndl.go...|    |        |    |      |   |info:ndljp/pid/96...|長野県竜王鉱山におけるゲルマニウム...|         |         |Distribution of g...|            |       |           安藤厚 ; 高島清|産業技術総合研究所地質調査総合センター|   日本|           1963|2016-01-20T23:44:40Z|          |                    |           jpn|
|http://iss.ndl.go...|    |        |    |      |   |info:ndljp/pid/96...|常磐炭田大津地区における地震探鉱法...|         |         |Seismic reflectio...|            |       |                 川島威|産業技術総合研究所地質調査総合センター|   日本|           1962|2016-01-20T23:44:40Z|          |                    |           jpn|
|http://iss.ndl.go...|    |        |    |      |   |info:ndljp/pid/96...|K-Ar age of Omi s...|         |         |    飛驒山地、青海片岩のK-Ar年令|            |       |Ken Shibata ; Tam...|産業技術総合研究所地質調査総合センター|   日本|           1968|2016-01-20T23:44:40Z|          |                    |           eng|
|http://iss.ndl.go...|    |        |    |      |   |info:ndljp/pid/96...|               本文訂正表|         |         |                    |            |       |                    |産業技術総合研究所地質調査総合センター|   日本|           1956|2016-01-20T23:44:40Z|          |                    |           jpn|
|http://iss.ndl.go...|    |        |    |      |   |info:ndljp/pid/96...|     空知炭田赤平町豊里地区調査速報|         |         |Survey of coal fi...|            |       |          淸水勇 ; 久保恭輔|産業技術総合研究所地質調査総合センター|   日本|           1952|2016-01-20T23:44:40Z|          |                    |           jpn|
|http://iss.ndl.go...|    |        |    |      |   |info:ndljp/pid/96...|佐世保炭田におけるいわゆる佐世保層...|         |         |On the upper part...|            |       |                長浜春夫|産業技術総合研究所地質調査総合センター|   日本|           1954|2016-01-20T23:44:40Z|          |                    |           jpn|
|http://iss.ndl.go...|    |        |    |      |   |info:ndljp/pid/96...|K-Ar age of the N...|         |         |     “日本国”片麻岩のK-Ar年代|            |       |Ken Shibata ; Tam...|産業技術総合研究所地質調査総合センター|   日本|           1966|2016-01-20T23:44:40Z|          |                    |           eng|
|http://iss.ndl.go...|    |        |    |      |   |info:ndljp/pid/96...|Ⅱ資料 畜水産食品中の合成抗菌剤等...|         |         |Survey report of ...|            |       |  辻村和也 ; 石原雅行 ; 吾郷昌信|                長崎県|   日本|        2013-09|2016-01-20T22:00:11Z|          |                    |           jpn|
|http://iss.ndl.go...|    |        |    |      |   |info:ndljp/pid/96...|         島根県吉永鉱山の銅鉱床|         |         |                    |            |       |         上野三義 ; 土井啓司|産業技術総合研究所地質調査総合センター|   日本|           1960|2016-01-20T23:44:40Z|          |                    |           jpn|
|http://iss.ndl.go...|    |        |    |      |   |info:ndljp/pid/96...|     島根県下のヘリウム資源について|         |         |Exploration for h...|            |       |                比留川貴|産業技術総合研究所地質調査総合センター|   日本|           1968|2016-01-20T23:44:40Z|          |                    |           jpn|
|http://iss.ndl.go...|    |        |    |      |   |info:ndljp/pid/96...|群馬県川場村の放射能異常地調査とウ...|         |         |On occurrence of ...|            |       |                石原舜三|産業技術総合研究所地質調査総合センター|   日本|           1967|2016-01-20T23:44:40Z|          |                    |           jpn|
+--------------------+----+--------+----+------+---+--------------------+--------------------+---------+---------+--------------------+------------+-------+--------------------+-------------------+-----+---------------+--------------------+----------+--------------------+--------------+
only showing top 20 rows


・case classの引数が最大22までしか引数が設定できませんでした。
・実際のTSVは30以上項目があるのでこれでは困りますね。。。
・ソートとかマッチングに使用しない項目はデリミタ付きでまとめるのがいいかもしれませんね。
・最後のselectの結果を表示する部分はshellなので。jarにしてドライバがclientじゃない場合、どうなるやら。