들어오는 JSON을 Kinesis Firehose로 보내는 AWS IoT 규칙이 있습니다. 만약 IoT 게시 내에서다중 회선 JSON 데이터가 AWS로 이동하는 것을 어떻게 필터링합니까? 하이브 테이블
JSON 데이터가 모두 한 줄에 - 예 :
이{"count":4950, "dateTime8601": "2017-03-09T17:15:28.314Z"}
관리자 UI에서의 IoT "테스트"섹션에서는 메시지를 게시 할 수 있습니다, 다음 (참고 디폴트는 멀티 포맷 - 라인 JSON은) :
{
"message": "Hello from AWS IoT console"
}
는 그때 궁극적 아테나가 사용하는 원주 형식으로 EMR에 의해 변환된다 S3,에 파이어 호스를 스트리밍하고 있습니다.
컬럼 형식으로 변환하는 동안 하이브 (특히 JSON SerDe)는 두 줄 이상에 걸쳐있는 JSON 객체를 처리 할 수 없습니다. 그것은 변환을 날려 버릴 것이고, 좋은 단일 라인 JSON 레코드를 변환하지 않을 것이다.
- 어떻게 설정 파이어 호스는 멀티 라인 JSON을 무시 않습니다
내 질문입니까?
- 만약 가능하지 않다면 테이블에로드하거나 적어도 예외를 잡아서 계속하기 전에 개행을 제거하라고 하이브에게 어떻게 말하는가?
: 여기
DROP TABLE site_sensor_data_raw;
CREATE EXTERNAL TABLE site_sensor_data_raw (
count int,
dateTime8601 timestamp
)
PARTITIONED BY(year int, month int, day int, hour int)
ROW FORMAT serde 'org.apache.hive.hcatalog.data.JsonSerDe'
with serdeproperties (
'ignore.malformed.json' = 'true',
"timestamp.formats"="yyyy-MM-dd'T'HH:mm:ss.SSS'Z',millis"
)
LOCATION 's3://...';
가하는 내 전체 HQL입니다 변환 :
--Example of converting to OEX/columnar formats
DROP TABLE site_sensor_data_raw;
CREATE EXTERNAL TABLE site_sensor_data_raw (
count int,
dateTime8601 timestamp
)
PARTITIONED BY(year int, month int, day int, hour int)
ROW FORMAT serde 'org.apache.hive.hcatalog.data.JsonSerDe'
with serdeproperties (
'ignore.malformed.json' = 'true',
"timestamp.formats"="yyyy-MM-dd'T'HH:mm:ss.SSS'Z',millis"
)
LOCATION 's3://bucket.me.com/raw/all-sites/';
ALTER TABLE site_sensor_data_raw ADD PARTITION (year='2017',month='03',day='09',hour='15') location 's3://bucket.me.com/raw/all-sites/2017/03/09/15';
ALTER TABLE site_sensor_data_raw ADD PARTITION (year='2017',month='03',day='09',hour='16') location 's3://bucket.me.com/raw/all-sites/2017/03/09/16';
ALTER TABLE site_sensor_data_raw ADD PARTITION (year='2017',month='03',day='09',hour='17') location 's3://bucket.me.com/raw/all-sites/2017/03/09/17';
DROP TABLE to_orc;
CREATE EXTERNAL TABLE to_orc (
count int,
dateTime8601 timestamp
)
STORED AS ORC
LOCATION 's3://bucket.me.com/orc'
TBLPROPERTIES ("orc.compress"="ZLIB");
INSERT OVERWRITE TABLE to_orc SELECT count,dateTime8601 FROM site_sensor_data_raw where year=2017 AND month=03 AND day=09 AND hour=15;