在 spark 中创建带有模式的配置单元外部表

Posted

技术标签:

【中文标题】在 spark 中创建带有模式的配置单元外部表【英文标题】:create hive external table with schema in spark 【发布时间】:2016-07-27 16:51:41 【问题描述】:

我正在使用 spark 1.6,我的目标是创建外部配置单元表,就像我在配置单元脚本中所做的那样。为此,我首先读入分区的 avro 文件并获取该文件的架构。现在我停在这里,我不知道如何将此模式应用于我的创建表。我使用斯卡拉。需要帮助。

【问题讨论】:

【参考方案1】:

最后,我用老式的方式自己制作。借助以下代码:

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。我想说,这种方式不灵活,但工作。如果有人有更好的想法,请发表评论。

【讨论】:

【参考方案2】:

我没有看到自动推断外部表架构的方法。所以我为字符串类型创建了案例。您可以为您的数据类型添加大小写。但我不确定你有多少列。我很抱歉,因为这可能不是一个干净的方法。

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

【讨论】:

hx 为您提供帮助。但这样一来,表就不会是分区表了。有什么想法吗?【参考方案3】:

试试下面的代码。

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) 

【讨论】:

你能说一下哪个是可变的吗,谢谢

以上是关于在 spark 中创建带有模式的配置单元外部表的主要内容,如果未能解决你的问题,请参考以下文章

在配置单元中创建外部表时更改默认位置

Presto 无法查询配置单元表

无法在红移光谱外部模式中创建视图

Spark Scala创建外部配置单元表不使用位置作为变量

在配置单元中创建表时向列添加默认值

在 hive 的外部表中创建分区