0

들어오는 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을 무시 않습니다

    내 질문입니까?

  • 만약 가능하지 않다면 테이블에로드하거나 적어도 예외를 잡아서 계속하기 전에 개행을 제거하라고 하이브에게 어떻게 말하는가?
하이브 테이블을 정의 할 때 이미 잘못된 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; 

답변

2

음, 사용되는 기본 JSON SerDe의 EMR과 Athena는 다중 라인 json 레코드에서 작동하지 않습니다. 각 JSON 레코드는 한 줄에 있어야합니다. 멀티 라인 JSON에

, 나는 하이브/하둡에서이 문제와 파일을 감안할 때, 심지어 프레스토의 (Athean에서 사용) 관점

  • 를 참조 겉보기 하이브/하둡과 JSON serde의는 할 수 없을 것입니다 json 레코드의 끝과 시작을 인식하여 객체 표현을 반환합니다.
  • 여러 파일이 주어지면 여러 줄 JSON 파일은 일반/n 구분 된 JSON 파일처럼 분할 할 수 없습니다.

은 EMR/아테나의 끝에서이 문제를 해결하기 위해, 당신은 SerDe의 등 데이터 구조와 캐치 예외를 기반으로

당신에게 설정 파이어 호스 멀티 어떻게 무시합니까 사용자 정의를 작성해야합니다 JSON?

Firehose에는 특정 형식을 무시할 수있는 기능이 없습니다. API (PutRecord 또는 PutRecordBatch)를 데이터 BLOB로 사용하여 가져 오는 모든 것을 취해 목적지로 전송합니다.당신이 파이어 호스에 데이터 수신 데이터를 변환하는 람다 함수를 사용하고 목적지로 변환 된 데이터를 넣을 수있는

http://docs.aws.amazon.com/firehose/latest/APIReference/API_PutRecordBatch.html

에 관계없이, AWS 파이어 호스는 AWS 람다와 데이터 변환을 제공합니다. 따라서이 기능을 사용하면 멀티 라인 JSON을 손쉽게 인식하고 평평하게 할 수 있습니다. 형식이 올바르지 않은 경우 레코드를 삭제할 수도 있습니다. IOT가 다중 행 json 데이터를 Firehose로 보내는 방법 (예 : 줄 단위 등)을 탐색하여 자신의 함수를 작성해야합니다.

https://aws.amazon.com/blogs/compute/amazon-kinesis-firehose-data-transformation-with-aws-lambda/

수없는 경우, 당신은 어떻게 하이브가 테이블에 로드하기 전에 줄 바꿈을 제거하거나 적어도 캐치 예외 계속하려고 말에?

여전히 FireLose 대상에 멀티 라인 JSON이있는 경우 ETL에 EMR이 있으므로 람다 대신 계산을 사용하여 JSON을 병합 할 수 있습니다. 스파크 (spark) 기능을 통해이 기능을 사용할 수도 있습니다. https://issues.apache.org/jira/browse/SPARK-18352

그런 다음이 데이터를 가져 와서 Athena가 작업 할 열 형식으로 만들 수 있습니다.