2016-08-19 50 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}") 
相關問題