2016-08-19 110 views
1

下面的代码是它如何使用scala写入HDFS。什么是HQL语法来创建一个Hive表来查询这些数据?我如何从使用数据块写入的AVRO文件创建Hive外部表?

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

例子中找到需要提供avro.schema.literal描述架构或avro.schema.url实际Avro的模式。

在火花外壳所有我需要做的阅读是这样的:

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

来自Spark-Avro源代码的评论指出*“模式进化尚未得到支持,在这里我们只选择一个随机样本文件来**找出整个数据集的模式** * (https://github.com/databricks/spark-avro/blob/master/src/main/scala/com/databricks/spark/avro/DefaultSource.scala)。 –

+0

Hive不能以这种方式工作,它需要**在CREATE时显式**当前的AVRO模式。但是文档(https://cwiki.apache.org/confluence/display/Hive/AvroSerDe)指出有两种方式可以做到这一点:或者链接到AVRO模式(可在本地文件/ URL中使用),或者简单地列出列,就好像它是一个Text文件一样,并让Hive从该SQL模式推断出AVRO模式。 –

回答

0

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

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