4 votes

créer une table externe hive avec un schéma dans spark

J'utilise spark 1.6 et je cherche à créer une table de ruche externe comme ce que je fais dans hive script. Pour ce faire, je commence par lire le fichier avro partitionné et obtenir le schéma de ce fichier. Maintenant je m'arrête ici, je n'ai aucune idée de comment appliquer ce schéma à ma table de création. J'utilise Scala. J'ai besoin d'aide.

4voto

G_cy Points 330

Enfin, je le fais moi-même à l'ancienne. Avec l'aide du code ci-dessous :

val rawSchema = sqlContext.read.avro("Path").schema
val schemaString = rawSchema.fields.map(field => field.name.replaceAll("""^_""", "").concat(" ").concat(field.dataType.typeName match {
        case "integer" => "int"
        case smt => smt
      })).mkString(",\n")

      val ddl =
      s"""
         |Create external table $tablename ($schemaString) \n
         |partitioned by (y int, m int, d int, hh int, mm int) \n
         |Stored As Avro \n
         |-- inputformat 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat' \n
         | -- outputformat 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat' \n
         | Location 'hdfs://$path'
       """.stripMargin

attention, aucun nom de colonne ne doit commencer par _ et le répertoire de stockage ne peut pas analyser integer . Je tiens à dire que cette méthode n'est pas flexible mais fonctionne. Si quelqu'un a une meilleure idée, veuillez commenter.

1voto

Ravi R Points 508

Je n'ai pas vu de moyen de déduire automatiquement le schéma des tables externes. J'ai donc créé un cas pour le type chaîne. Vous pourriez ajouter des cas pour votre type de données. Mais je ne suis pas sûr du nombre de colonnes que vous avez. Je vous prie de m'excuser, car cette approche n'est peut-être pas parfaite.

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.{Row, SaveMode};
import org.apache.spark.sql.types.{StructType,StructField,StringType};

val hiveContext = new org.apache.spark.sql.hive.HiveContext(sc)
val results = hiveContext.read.format("com.databricks.spark.avro").load("people.avro")

val schema = results.schema.map( x => x.name.concat(" ").concat( x.dataType.toString() match { case "StringType" => "STRING"} ) ).mkString(",")

val hive_sql = "CREATE EXTERNAL TABLE people_and_age (" + schema + ")                  ROW FORMAT DELIMITED                 FIELDS TERMINATED BY ','                LOCATION '/user/ravi/people_age'"

hiveContext.sql(hive_sql)
results.saveAsTable("people_age",SaveMode.Overwrite)
hiveContext.sql("select * from people_age").show()

-1voto

Ishan Kumar Points 688

Essayez le code ci-dessous.

val htctx= new HiveContext(sc)
htctx.sql(create extetnal table tablename schema partitioned by attribute row format serde serde.jar field terminated by value location path)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X