hive外部表只为所有列生成空数据

krugob8w  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(471)

我想创造一个 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会自行解决这个问题。
请帮帮我

bqjvbblv

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')

相关问题