0

HDFSの場所からcsvファイルを読み取り、そのデータをハイブテーブルに保存するために、Eclipseで次のScalaプログラムを作成しました[ローカルマシンにあるVMWareで実行されているHDP2.4サンドボックスを使用しています]:

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.hive.HiveContext

object HDFS2HiveFileRead {
  def main(args:Array[String]){
    val conf = new SparkConf()
                    .setAppName("HDFS2HiveFileRead")
                    .setMaster("local")

    val sc = new SparkContext(conf)

    val hiveContext = new HiveContext(sc)

    println("loading data") 
    val loadDF = hiveContext.read
                            .format("com.databricks.spark.csv")
                            .option("header","true")
                            .option("delimiter",",")
                            .load("hdfs://192.168.159.129:8020/employee.csv")
    println("data loaded") 
    loadDF.printSchema()

    println("creating table")
    loadDF.write.saveAsTable("%s.%s".format( "default" , "tblEmployee2" ))
    println("table created")

    val selectQuery = "SELECT * FROM default.tblEmployee2"

    println("selecting data")
    val result = hiveContext.sql(selectQuery)

    result.show()}}

このプログラムを Eclipse から実行すると、使用して

実行 -> Scala アプリケーション

オプション: Eclipse コンソールで次の結果が表示されます。

データのロード

読み込まれたデータ

|-- empid: 文字列 (nullable = true)

|-- empname: 文字列 (nullable = true)

|-- empage: 文字列 (nullable = true)

テーブルの作成

17/06/29 13:27:08 INFO CatalystWriteSupport: Catalyst スキーマで Parquet WriteSupport を初期化しました: { "type": "struct", "fields": [ { "name": "empid", "type": "string" , "nullable" : true, "metadata" : { } }, { "name" : "empname", "type" : "string", "nullable" : true, "metadata" : { } }, { "name" : "empage", "type" : "string", "nullable" : true, "metadata" : { } } ] } および対応する Parquet メッセージ タイプ: message spark_schema { optional binary empid (UTF8); オプションのバイナリ empname (UTF8); オプションのバイナリ empage (UTF8); }

テーブルが作成されました

データの選択

+-----+--------+------+

|エンピッド| empname|empage|

+-----+--------+------+

| | 1201| サティシュ| 25|

| | 1202| クリシュナ| 28|

| | 1203| アミット| 39|

| | 1204| 投げられた| 23|

| | 1205| プルドヴィ| 23|

+-----+--------+------+

17/06/29 13:27:14 エラー ShutdownHookManager: Spark 一時ディレクトリの削除中に例外が発生しました: C:\Users\cb\AppData\Local\Temp\spark-c65aa16b-6448-434f-89dc-c318f0797e10 java.io.IOException:削除に失敗しました: C:\Users\cb\AppData\Local\Temp\spark-c65aa16b-6448-434f-89dc-c318f0797e10

これは、目的の HDFS の場所 [HDP に存在する] から csv データが読み込まれ、tblEmployee2 という名前のテーブルもハイブに作成されたことを示しています。コンソールで結果を読み取って確認できます。Spark ジョブを実行してこのテーブルからデータを読み取ることで、このテーブルを何度も読み取ることさえできました。

しかし、パテを介してHDP2.4にアクセスし、ハイブでこのテーブルを表示しようとするとすぐに問題が発生します。

1) 私はそこにこのテーブルを見ることができませんでした。

2) このコードがハイブにマネージド/内部テーブルを作成すると考えているため、HDFS の特定の場所に存在する csv ファイルもそのベースの場所からハイブのメタストアの場所に移動する必要がありますが、これは発生していませんか?

3) Eclipse で metastore_db フォルダーが作成されていることも確認できましたが、これは、この tblEmployee2 がローカル/Windows マシンで作成されているということですか?

4) この問題を解決し、コードに hdp でハイブ テーブルを作成するように依頼するにはどうすればよいですか? ここで不足している構成はありますか?

5) 実行中に最後のエラーが発生するのはなぜですか? 迅速な対応/ポインタをいただければ幸いです。

UPDATE追加したときによく考えた後hiveContext.setConf("hive.metastore.uris","thrift://192.168.159.129:9083")

コードは少し移動しましたが、いくつかの許可関連の問題が発生し始めました。VMWare に存在するハイブのデフォルト データベースにこのテーブル [tblEmployee2] が表示されるようになりましたが、SparkSQL だけでそれを行います。

17/06/29 22:43:21 WARN HiveContext$$anon$2: Could not persist `default`.`tblEmployee2` in a Hive compatible way. Persisting it into Hive metastore in Spark SQL specific format.

したがって、私はまだ HiveContext を使用できず、上記の問題 2 ~ 5 は引き続き発生します。

よろしく、ブペシュ

4

1 に答える 1

1

Spark をローカル モードで実行しています。

 val conf = new SparkConf()
.setAppName("HDFS2HiveFileRead")
                .setMaster("local")

ローカル モードでは、saveAsTable を指定すると、ローカル マシンにテーブルを作成しようとします。yarn モードで実行するように構成を変更します。

詳細については、以下の URL を参照してください。 http://www.coding-daddy.xyz/node/7

于 2017-06-29T15:57:06.807 に答える