我想创造一个 Hive external table
再加上一些 avro
使用生成的文件 spark-scala
. 我正在使用 CDH 5.16
哪个有 hive 1.1
, spark 1.6
.
我创造了 hive external table
,已成功运行。但是当我查询得到的数据时 NULL
对于所有列。我的问题与此类似
经过研究,我发现这可能是图式的问题。但是我在这个位置找不到这些avro文件的模式文件。
我是个新手 avro
文件类型。有人能帮帮我吗。
下面是我的 spark
将文件另存为的代码段 avro
:
df.write.mode(SaveMode.Overwrite).format("com.databricks.spark.avro").save("hdfs:path/user/hive/warehouse/transform.db/prod_order_avro")
下面是我的配置单元外部表create语句:
create external table prod_order_avro
(ProductID string,
ProductName string,
categoryname string,
OrderDate string,
Freight string,
OrderID string,
ShipperID string,
Quantity string,
Sales string,
Discount string,
COS string,
GP string,
CategoryID string,
oh_Updated_time string,
od_Updated_time string
)
STORED AS AVRO
LOCATION '/user/hive/warehouse/transform.db/prod_order_avro';
下面是我查询数据时得到的结果: select * from prod_order_avro
同时,当我读这些 avro
文件使用 spark-scala
作为 dataframe
把它们打印出来,我得到了正确的结果。下面是 spark
我用来读取这些数据的代码:
val df=hiveContext.read.format("com.databricks.spark.avro").option("header","true").load("hdfs:path/user/hive/warehouse/transform.db/prod_order_avro")
我的问题是,
创建这些时 avro
档案,我需要换一下吗 spark
单独创建模式文件的代码,还是将其嵌入
文件。如果需要分开,那么如何实现呢?
如果没有,如何创建 hive
表,以便自动从文件中检索架构。我了解到,在最新版本中,如果文件中存在模式,hive会自行解决这个问题。
请帮帮我
1条答案
按热度按时间bqjvbblv1#
解决了这个..这是一个架构问题。架构未嵌入
avro
所以我不得不用avro-tools
并在创建表时传递它。现在开始工作了。我遵循以下步骤:
从中提取了少量数据
avro
文件存储在hdfs
到本地系统的文件中。下面是用于相同的命令:sudo hdfs dfs -cat /path/file.avro | head --bytes 10K > /path/temp.txt
使用avro-tools getschema
从该数据中提取架构的命令:avro-tools getschema /path/temp.txt
复制生成的模式(它将以json
数据)放入新文件中.avsc
扩展并将其上载到HDFS
在创建Hive External table
添加以下属性:TBLPROPERTIES('avro.schema.url'='hdfs://path/schema.avsc')