当前位置: 首页 > 知识库问答 >
问题:

从ORC文件创建外部配置单元表的方法

令狐昌胤
2023-03-14

我正在尝试在ORC文件上创建外部配置单元表。

create external table fact_scanv_dly_stg (
store_nbr int,
geo_region_cd char(2),
scan_id int,
scan_type char(2),
debt_nbr string,
mds_fam_id string,
upc_nbr string,
sales_unit_qty string,
sales_amt string,
cost_amt string,
visit_dt string,
rtn_amt string,
crncy_cd string,
op_cmpny_cd string)
STORED AS ORC
location 'hdfs:///my/location/scanv_data/'; 
 |-- _col0: integer (nullable = true)
 |-- _col1: string (nullable = true)
 |-- _col2: integer (nullable = true)
 |-- _col3: byte (nullable = true)
 |-- _col4: short (nullable = true)
 |-- _col5: integer (nullable = true)
 |-- _col6: decimal(18,0) (nullable = true)
 |-- _col7: decimal(9,2) (nullable = true)
 |-- _col8: decimal(9,2) (nullable = true)
 |-- _col9: decimal(9,2) (nullable = true)
 |-- _col10: date (nullable = true)
 |-- _col11: decimal(9,2) (nullable = true)
 |-- _col12: string (nullable = true)
 |-- _col13: string (nullable = true)

但当我试图在创建的表上执行select操作时,会出现以下错误:

select * from fact_scanv_dly_stg limit 5;


OK
Failed with exception java.io.IOException:org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.ClassCastException: org.apache.hadoop.hive.serde2.io.ByteWritable cannot 
be cast to org.apache.hadoop.hive.serde2.io.HiveCharWritable

有什么建议吗??

共有1个答案

壤驷阳冰
2023-03-14

发生此错误的原因是,在将数据从spark写入ORC文件时,列的数据类型也会被保留,因此在创建配置单元表时,您需要将每个列的数据类型映射为与dataframe模式相同的数据类型。

这里,发生此错误的原因是spark模式中的columncol3是byte,而您在hive中将其指定为字符串。解决方案是将所有列强制转换为spark中所需的数据类型,然后写入ORC文件,或者将配置单元模式中的精确数据类型映射为spark。

 类似资料:
  • 我已经从Map R集群复制了所有orc文件,并遵循了相同的文件夹结构 创建了位置为#1的orc格式表 然后执行此命令“msck REPAIR TABLE<>” 上面的步骤通过时没有出错,但当我查询分区时,作业失败,出现以下错误 有人能告诉我,我们可以直接从ORC文件创建配置单元ORC分区表吗? 我的存储是蔚蓝数据湖。

  • 问题内容: 我每天都在“测试”文件夹下写入文件。例如: 我在创建的LOGS表中看不到任何数据。 但是,我使用创建表 我可以看到那几天的记录。 我想在我的HIVE表中的/ test目录下查看所有数据,而且/ test目录每天都填充有新文件。 问题答案: 选项1 为了支持子目录 如果您的Hive版本低于2.0.0,那么 选项2 创建一个分区表 如果使用标准约定保留目录,例如,而不是保留目录,将更易于管

  • 我有一些困难,以确保我利用已排序的数据在一个配置单元表。(使用ORC文件格式) 我知道我们可以通过在create DDL中声明子句来影响数据从配置单元表中读取的方式。 这意味着每次查询该表时,数据将通过在各个映射器之间分发,然后对其进行排序。 我的问题是: 我不希望数据被拆分为文件(桶),因为卷不是那么多,我会保留小文件。 但是,我确实想利用排序插入。 我真的需要在create DLL语句中使用吗

  • 1-创建了源表 2-将数据从本地加载到源表 3-创建了另一个带有分区的表-partition_table 我不确定如何在外部表中进行分区。有人能帮我一步一步地描述一下吗?。