AVRO文件上的Hive外部表仅对所有列产生NULL数据

时间:2019-07-17 07:02:12

标签: hadoop hive avro spark-avro hive-table

我正在尝试在使用Hive external table生成的某些avro文件之上创建spark-scala。我正在使用CDH 5.16hive 1.1的{​​{1}}。

我创建了spark 1.6,它运行成功。但是,当我查询数据时,所有列都得到hive external tableMy 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';

Result

同时,当我使用select * from prod_order_avro作为avro读取这些spark-scala文件并打印它们时,我得到了正确的结果。 以下是我用来读取这些数据的dataframe代码:

spark

avro files data when read through spark-scala

我的问题是

  • 在创建这些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负责 如果文件中存在架构,则此问题本身就存在。

请在这里帮助我

1 个答案:

答案 0 :(得分:1)

解决了此问题。这是一个架构问题。该架构未嵌入avro文件。因此,我不得不使用avro-tools提取架构,并在创建表时将其传递。现在可以正常工作了。

我遵循以下步骤:

  1. avro中存储的hdfs个文件中提取了一些数据到 本地系统。以下是用于相同命令的命令:

    sudo hdfs dfs -cat /path/file.avro | head --bytes 10K > /path/temp.txt

  2. 使用avro-tools getschema命令从此数据中提取模式:

    avro-tools getschema /path/temp.txt

  3. 将生成的模式(将以json数据的形式)复制到新 扩展名为.avsc的文件,并将其上传到HDFS

  4. 在创建Hive External table时,将以下属性添加到其中:

    TBLPROPERTIES('avro.schema.url'='hdfs://path/schema.avsc')