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.
Réponses
Trop de publicités?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.
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()