我正在使用spark1.6,我的目标是像在配置单元脚本中那样创建外部配置单元表。为此,我首先读入已分区的avro文件并获取该文件的模式。现在我停在这里,我不知道如何将这个模式应用到我的创建表中。我用scala。需要帮助。
sxpgvts31#
最后,我用老式的方法自己做。借助以下代码:
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
注意,列名不能以开头 _ Hive无法解析 integer . 我想说的是,这种方式是不灵活的,但工作。如果有人有更好的主意,请发表评论。
_
integer
0kjbasz62#
我没有找到一种自动推断外部表模式的方法。所以我为string类型创建了case。可以为数据类型添加case。但我不知道你有多少列。我道歉,因为这可能不是一个干净的方法。
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()
nnvyjq4y3#
请尝试以下代码。
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)
3条答案
按热度按时间sxpgvts31#
最后,我用老式的方法自己做。借助以下代码:
注意,列名不能以开头
_
Hive无法解析integer
. 我想说的是,这种方式是不灵活的,但工作。如果有人有更好的主意,请发表评论。0kjbasz62#
我没有找到一种自动推断外部表模式的方法。所以我为string类型创建了case。可以为数据类型添加case。但我不知道你有多少列。我道歉,因为这可能不是一个干净的方法。
nnvyjq4y3#
请尝试以下代码。