0

J'ai écrit le programme Scala suivant dans Eclipse pour lire un fichier CSV à partir d'un emplacement dans HDFS, puis enregistrer ces données dans une table Hive [J'utilise HDP2.4 bac à sable en cours d'exécution sur mon VMWare présent sur ma machine locale]:Création de table Hive dans HDP à l'aide du travail Apache Spark

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()}} 

Quand je lance ce programme de mon Eclipse; en utilisant

Run As -> Scala application

Option

: Il me montre ci-dessous les résultats sur la console Eclipse:

chargement des données

données chargées

racine

| - empid: string (annulable = true)

| - empname: string (annulable = true)

| - empage: string (annulable = true)

création de la table

17/06/29 13:27:08 INFO CatalystWriteSupport: initialisé Parquet WriteSupport avec le schéma de catalyseur: { "type": "struct", "champs": [{ "name": "empid", "type": "chaîne", "nullable": true, "métadonnées": {}}, { "name": "empname", "type": "string", "nullable": true, "métadonnées": {}}, { "name": "empage", "type": "chaîne", "nullable": true, "metadata": {}}]} et le type de message Parquet correspondant: message spark_schema {facultatif binaire empid (UTF8); optionnel nom_obinaire binaire (UTF8); empage binaire facultatif (UTF8); }

table créée

données de sélection

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

| empid | empname | empage |

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

| 1201 | satish | 25 |

| 1202 | Krishna | 28 |

| 1203 | amith | 39 |

| 1204 | javé | 23 |

| 1205 | prudvi | 23 |

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

17/06/29 13:27:14 ERREUR ShutdownHookManager: Exception lors de la suppression temp Spark dir: C: \ Utilisateurs \ cb \ AppData \ Local \ Temp \ étincelle-c65aa16b-6448-434f-89dc-c318f0797e10 java.io.IOException: Impossible de supprimer: C: \ Users \ cb \ AppData \ Local \ Temp \ étincelle c65aa16b-6448-434f-89dc-c318f0797e10

Cela montre que les données csv a été chargé de l'emplacement désiré HDFS [présent dans HDP] et une table avec le nom tblEmployee2 a également été créée dans hive, car je pouvais lire et voir les résultats dans la console. Je pourrais même lire cette table encore et encore en exécutant n'importe quel étincelle pour lire les données de cette table

MAIS, le problème est dès que je vais à mon HDP2.4 à travers mastic et essayer de voir cette table dans la ruche ,

1) Je ne pouvais pas voir cette table là. 2) Je considère que ce code créera une table interne/gérée dans la ruche, donc le fichier csv présent à un emplacement donné dans HDFS devrait également être déplacé de son emplacement de base à l'emplacement du métastore, ce qui n'est pas le cas.

3) Je pourrais aussi voir le dossier metastore_db créé dans mon Eclipse, est-ce que cela signifie que ce tblEmployee2 est créé dans ma machine locale/windows?

4) Comment puis-je résoudre ce problème et demander à mon code de créer une table hive dans hdp? Y a-t-il une configuration qui me manque ici?

5) Pourquoi ai-je la dernière erreur dans mon exécution? Toute réponse rapide/pointeur serait appréciée.

MISE À JOUR Après avoir réfléchi beaucoup quand j'ajouté hiveContext.setConf("hive.metastore.uris","thrift://192.168.159.129:9083")

code déplacé un peu, mais avec quelques problèmes d'autorisation liés ont commencé à apparaître. Je pouvais maintenant voir ce tableau [tblEmployee2] dans ma base de données par défaut de ruche de présent dans mon VMWare, mais il le fait avec SparkSQL par lui-même:

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. 

Par conséquent, je ne suis toujours pas en mesure d'utiliser HiveContext et mes problèmes mentionnés ci-dessus 2-5 persiste encore.

Cordialement, Bhupesh

Répondre

0

Vous utilisez l'étincelle en mode local. En mode local, lorsque vous spécifiez saveAsTable, il essaie de créer la table dans la machine locale. En mode local, lorsque vous spécifiez saveAsTable. Changez votre configuration pour qu'elle fonctionne en mode fil.

Vous pouvez consulter l'URL ci-dessous, pour plus de détails: http://www.coding-daddy.xyz/node/7

+0

Merci pour votre réponse @Lakshman Battini mais en disant cela, je vous demande simplement mon Spark à fonctionner en mode local. Je pourrais maintenant remarquer que j'ai raté fournir le serveur d'épargne IP de la ruche et le port. Ce qui quand j'ai mis à jour dans mon code il a commencé à travailler dans une certaine mesure mais j'ai commencé à obtenir des problèmes liés à la permission puis après. Je suis en train de mettre à jour/éditer ma question avec mes derniers changements. –