【问题标题】:How do I create a Hive External table from AVRO files writen using databricks?如何从使用 databricks 编写的 AVRO 文件创建 Hive 外部表?
【发布时间】:2016-12-26 22:49:06
【问题描述】:

下面的代码是如何使用 scala 将其写入 HDFS。创建 Hive 表来查询这些数据的 HQL 语法是什么?

import com.databricks.spark.avro._
val path = "/user/myself/avrodata"
dataFrame.write.avro(path)

我发现的示例需要提供 avro.schema.literal 来描述架构或 avro.schema.url 到实际的 avro 架构。

在 spark-shell 中,我需要做的是:

scala> import com.databricks.spark.avro._
scala> val df = sqlContext.read.avro("/user/myself/avrodata")
scala> df.show()

【问题讨论】:

  • 来自 Spark-Avro 源代码的评论指出 “尚不支持模式演化。这里我们只选择一个随机样本文件来找出模式 整个数据集” (github.com/databricks/spark-avro/blob/master/src/main/scala/com/…)。
  • Hive 不能以这种方式工作,它在创建时需要明确当前的 AVRO 模式。但是文档 (cwiki.apache.org/confluence/display/Hive/AvroSerDe) 指出有两种方法可以做到这一点:要么链接到 AVRO 模式(在本地文件/URL 中可用),要么简单地列出列,就好像它是一个文本文件并让Hive 从该 SQL 模式推断 AVRO 模式。

标签: scala apache-spark hive avro databricks


【解决方案1】:

所以我作弊让这个工作。基本上我创建了一个临时表并使用 HQL 从临时表中创建和插入数据。此方法使用临时表中的元数据并创建我想要创建和填充的 avro 目标表。如果数据框可以从其架构中创建一个临时表,为什么它不能将表保存为 avro?

dataFrame.registerTempTable("my_tmp_table")
sqlContext.sql(s"create table ${schema}.${tableName} stored as avro as select * from ${tmptbl}")

【讨论】:

    猜你喜欢
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多