Impala - 处理分区列

时间:2017-06-12 09:08:17

标签: impala hadoop-partitioning

我目前正在开展一项工作,将数据从临时表复制到最终表。登台表中用于最终表上的分区的列具有多个带单引号的记录(例如,供应' A,需要' A等)。因此,impala INSERT OVERWRITE语句失败,并显示以下消息:

  

查询:插入OVERWRITE rec_details(           rec_id,rec_name,rec_value)PARTITION(rec_part)SELECT           rec_id,rec_name,rec_value,rec_name FROM staging_rec_details查询提交时间:2017-06-12 03:23:22(协调员:   http://hostname:port)可以在以下位置监控查询进度:   http://hostname:port/query_plan?query_id=ea4e14229d1c0119:a839f51500000000   警告:TableLoadingException:无法加载表的元数据:   rec_details CAUSED BY:IllegalStateException:无效的分区名称:   rec_part = -supplies' A

DDL声明如下:

--DDL 1 - Staging Table
CREATE EXTERNAL TABLE staging_rec_details(
    rec_id STRING, 
    rec_name STRING, 
    rec_value STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\007'
LINES TERMINATED BY '\001'
--WITH SERDEPROPERTIES ('serialization.format'='\t', 'field.delim'='\t')
STORED AS TEXTFILE
LOCATION '/staging/staging_rec_details'

--DDL 2 - Final Table
CREATE EXTERNAL TABLE rec_details(
    rec_id STRING, 
    rec_name STRING, 
    rec_value STRING
)
PARTITIONED BY (rec_part STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\007'
LINES TERMINATED BY '\001'
--WITH SERDEPROPERTIES ('serialization.format'='\t', 'field.delim'='\t')
STORED AS PARQUET
LOCATION '/data/rec_details'

以下是用于内容记录的Impala语句:

--Impala SQL
INSERT OVERWRITE rec_details
(
        rec_id, rec_name, rec_value
)
PARTITION (rec_part)
SELECT
        rec_id, rec_name, rec_value, rec_name
FROM staging_rec_details

当分区列有一个特殊字符(如单引号)时,如何将数据插入到最终表中?

1 个答案:

答案 0 :(得分:0)

通过替换特殊字符来解决问题:

-- Modified Impala SQL 
   INSERT OVERWRITE rec_details 
   (
        rec_id, rec_name, rec_value 
   ) PARTITION (rec_part) 
   SELECT
        rec_id, rec_name, rec_value,            
        regexp_replace(rec_name,'\'','') 
   FROM staging_rec_details