我正在尝试在使用Hive external table
生成的某些avro
文件之上创建spark-scala
。我正在使用CDH 5.16
,hive 1.1
的{{1}}。
我创建了spark 1.6
,它运行成功。但是,当我查询数据时,所有列都得到hive external table
。
My problem is similar to this
经过一些研究,我发现这可能是架构问题。但是我在该位置找不到这些avro文件的架构文件。
我对NULL
文件类型很陌生。有人可以帮我吗?
下面是我的avro
代码段,其中我已将文件另存为spark
:
avro
以下是我的配置单元外部表create语句:
df.write.mode(SaveMode.Overwrite).format("com.databricks.spark.avro").save("hdfs:path/user/hive/warehouse/transform.db/prod_order_avro")
以下是我查询数据时得到的结果:
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负责
如果文件中存在架构,则此问题本身就存在。请在这里帮助我
答案 0 :(得分:1)
解决了此问题。这是一个架构问题。该架构未嵌入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')