一、目的
在用Flume把Kafka的數據采集寫入Hive的ODS層表的HDFS文件路徑后,發現HDFS文件中沒問題,但是ODS層表中字段的數據卻有問題,字段中的JSON數據不全
二、Hive處理JSON數據方式
(一)將Flume采集Kafka的JSON數據以字符串的方式整個寫入Hive表中,然后再用get_json_object或json_tuple進行解析
1、ODS層建靜態分區外部表,Flume直接寫入ODS層表的HDFS路徑下
create external table if not exists ods_evaluation(evaluation_json string ) comment '評價數據外部表——靜態分區' partitioned by (day string) stored as SequenceFile ;
2、用get_json_object進行解析
selectget_json_object(evaluation_json,'$.deviceNo') device_no,get_json_object(evaluation_json,'$.createTime') create_time,get_json_object(evaluation_json,'$.cycle') cycle,get_json_object(evaluation_json,'$.laneNum') lane_num,get_json_object(evaluation_json,'$.evaluationList') evaluation_list from hurys_dc_ods.ods_evaluation ;
(二)在導入Hive表之前將JSON數據已拆分好,需要使用JsonSerDe
create external table if not exists ods_track(device_no string comment '設備編號',create_time timestamp comment '創建時間',track_data string comment '軌跡數據集合(包含多個目標點)'
)
comment '軌跡數據表——靜態分區'
partitioned by (day date)
row format serde 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
with serdeproperties (
"separatorChar" = ",",
"quoteChar" = "\"",
"escapeChar" = "\\"
)
tblproperties("skip.header.line.count"="1") ;
注意:使用JsonSerDe時,每行必須是一個完整的JSON,一個JSON不能跨越多行,否則不能使用JsonSerDe
三、ODS層原有建表SQL
create external table if not exists ods_evaluation(evaluation_json string
)
comment '評價數據外部表——靜態分區'
partitioned by (day string)
row format delimited fields terminated by '\x001'
lines terminated by '\n'
stored as SequenceFile
;
四、HDFS文件中的數據
HDFS文件中JSON數據完整,數據沒問題
五、報錯詳情
查看表數據時發現evaluation_json字段的數據不完整
六、解決方法
(一)重新建表,建表語句中刪除其中兩行
--row format delimited fields terminated by '\x001'
--lines terminated by '\n'
(二)新建表SQL
create external table if not exists ods_evaluation(evaluation_json string ) comment '評價數據外部表——靜態分區' partitioned by (day string) stored as SequenceFile ;
七、查詢新表中evaluation_json字段的數據
數據解析成功!
又解決了一個問題,賓果!