prosource

JSON 데이터로 HIVE 테이블을 만드는 방법은 무엇입니까?

probook 2023. 2. 16. 21:51
반응형

JSON 데이터로 HIVE 테이블을 만드는 방법은 무엇입니까?

일부 JSON 데이터(네스트됨)로 하이브 테이블을 만들고 이에 대한 쿼리를 실행합니다.이게 가능하기나 해?

JSON 파일을 S3에 업로드하고 EMR 인스턴스를 실행하는 데까지 이르렀는데 JSON 파일을 하이브 테이블로 만들려면 하이브 콘솔에 무엇을 입력해야 하는지 모르겠습니다.

저를 시작할 수 있는 명령어 예시를 가지고 계신 분 계십니까?Google에서 도움이 되는 것을 찾을 수 없습니다.

실제로는 JSON SerDe를 사용할 필요가 없습니다.여기 훌륭한 블로그 투고가 있습니다(저자와는 전혀 관계가 없습니다).

http://pkghosh.wordpress.com/2012/05/06/hive-plays-well-with-json/

에서는 내장된 함수 json_tuple을 사용하여 쿼리 시 json을 해석하는 전략의 개요를 설명합니다(테이블 정의 시점은 제외).

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-json_tuple

따라서 기본적으로 테이블 스키마는 각 행을 단일 'string' 열로 로드한 후 필요에 따라 쿼리별로 관련 json 필드를 추출하는 것입니다. 예를 들어 이 쿼리는 블로그 게시물에서 다음과 같습니다.

SELECT b.blogID, c.email FROM comments a LATERAL VIEW json_tuple(a.value, 'blogID', 'contact') b 
AS blogID, contact  LATERAL VIEW json_tuple(b.contact, 'email', 'website') c 
AS email, website WHERE b.blogID='64FY4D0B28';

제 경험상으로는 이것이 더 신뢰할 수 있는 것으로 판명되었습니다(JSON serdes, 특히 중첩된 객체에 관해 다양한 난해한 문제에 직면했습니다).

하이브가 테이블의 열에 JSON을 매핑하려면 JSON serde를 사용해야 합니다.

의 예를 다음에 나타냅니다.

http://aws.amazon.com/articles/2855

안타깝게도 제공된 JSON serde는 중첩된 JSON을 잘 처리하지 못하기 때문에 사용하려면 JSON을 평평하게 해야 할 수 있습니다.

다음은 문서에서 올바른 구문의 예입니다.

create external table impressions (
    requestBeginTime string, requestEndTime string, hostname string
  )
  partitioned by (
    dt string
  )
  row format 
    serde 'com.amazon.elasticmapreduce.JsonSerde'
    with serdeproperties ( 
      'paths'='requestBeginTime, requestEndTime, hostname'
    )
  location 's3://my.bucket/' ;

같은 문제를 해결해야 하는데, 아직 JSON SerDes에 링크된 것은 하나도 만족스럽지 못한 것 같습니다.Amazon은 좋을지도 모릅니다만, 그 출처를 찾을 수 없습니다(링크를 가지고 계신 분?).

HCatalog의 빌트인 JsonSerDe는 실제로 다른 곳에서 HCatalog를 사용하고 있지 않지만 저를 위해 기능하고 있습니다.

https://github.com/apache/hcatalog/blob/branch-0.5/core/src/main/java/org/apache/hcatalog/data/JsonSerDe.java

HCatalog의 JsonSerDe를 사용하려면 hcatalog-core .jar를 Hive의 auxpath에 추가하고 하이브 테이블을 만듭니다.

$ hive --auxpath /path/to/hcatalog-core.jar

hive (default)>
create table my_table(...)
ROW FORMAT SERDE
  'org.apache.hcatalog.data.JsonSerDe'
...
;

여기에 좀 더 자세한 내용을 적어놨습니다.

http://ottomata.org/tech/too-many-hive-json-serdes/

hcatalog-core의 Hive 0.12 이후에는 JSON 데이터를 시리얼화 및 역직렬화하는 JsonSerDe가 있습니다.따라서 다음 예시와 같은 외부 테이블을 작성하기만 하면 됩니다.

CREATE EXTERNAL TABLE json_table (
    username string,
    tweet string,
    timestamp long)
ROW FORMAT SERDE
'org.apache.hive.hcatalog.data.JsonSerDe'
STORED AS TEXTFILE
LOCATION
 'hdfs://data/some-folder-in-hdfs'

대응하는 json 데이터 파일은 다음과 같습니다.

{"username":"miguno","tweet":"Rock: Nerf paper, scissors is fine.","timestamp": 1366150681 }
{"username":"BlizzardCS","tweet":"Works as intended.  Terran is IMBA.","timestamp": 1366154481 }

.json 파일에서 SerDe 스키마를 생성하는 중

.json 파일이 크면 스키마를 손으로 쓰는 것이 귀찮을 수 있습니다.이 경우 이 편리한 도구를 사용하여 자동으로 생성할 수 있습니다.

https://github.com/strelec/hive-serde-schema-gen

JSON 처리 기능은 이제 Hive에서 바로 사용할 수 있습니다.

하이브 4.0.0 이후

CREATE TABLE ... STORED AS JSONFILE

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-StorageFormatsStorageFormatsRowFormat,StorageFormat,andSerDe

각 JSON 개체는 한 줄에 맞도록 평탄해야 합니다(새 줄 문자를 지원하지 않음).이러한 개체는 정식 JSON 배열의 일부가 아닙니다.

{"firstName":"John","lastName":"Smith","Age":21}
{"firstName":"Jane","lastName":"Harding","Age":18}

JSON 파일로 Hive 테이블을 만들려면 JSON 구조에 대한 HiveQL DDL 표준에 따라 CREATE TABLE 문을 작성해야 합니다.

네스트된 JSON 파일을 사용하는 경우 매우 복잡할 수 있으므로 빠르고 쉬운 생성기를 사용할 것을 권장합니다.https://hivetablegenerator.com/

HiveQL을 사용하여 JSON 파일을 분석하려면 다음 중 하나가 필요합니다.org.openx.data.jsonserde.JsonSerDe또는org.apache.hive.hcatalog.data.JsonSerDe올바르게 동작합니다.

org.displays.hcatalog.data 를 참조해 주세요.JsonSerDe
Apache의 기본 JSON SerDe입니다.이것은 이벤트와 같은 JSON 데이터를 처리하는 데 일반적으로 사용됩니다.이러한 이벤트는 새 행으로 구분된 JSON 인코딩 텍스트 블록으로 표시됩니다.Hive JSON SerDe는 맵 또는 구조 키 이름에 중복 키를 허용하지 않습니다.

org.openx.data.intermonserde 를 지정합니다.JsonSerDe
OpenX JSON SerDe는 네이티브 Apache와 비슷하지만 "ignore.malformed.json", "case.insensitive" 등의 여러 옵션 속성을 제공합니다.내 생각에, 보통 중첩된 JSON 파일을 처리할 때 더 잘 작동합니다.

이 복잡한 JSON 파일의 샘플은 다음과 같습니다.

{
  "schemaVersion": "1.0",
  "id": "07c1687a0fd34ebf8a42e8a8627321dc",
  "accountId": "123456677",
  "partition": "aws",
  "region": "us-west-2",
  "severity": {
      "score": "0",
      "description": "Informational"
  },
  "createdAt": "2021-02-27T18:57:07Z",
  "resourcesAffected": {
      "s3Bucket": {
          "arn": "arn:aws:s3:::bucket-sample",
          "name": "bucket-sample",
          "createdAt": "2020-08-09T07:24:55Z",
          "owner": {
              "displayName": "account-name",
              "id": "919a30c2f56c0b220c32e9234jnkj435n6jk4nk"
          },
          "tags": [],
          "defaultServerSideEncryption": {
              "encryptionType": "AES256"
          },
          "publicAccess": {
              "permissionConfiguration": {
                  "bucketLevelPermissions": {
                      "accessControlList": {
                          "allowsPublicReadAccess": false,
                          "allowsPublicWriteAccess": false
                      },
                      "bucketPolicy": {
                          "allowsPublicReadAccess": true,
                          "allowsPublicWriteAccess": false
                      },
                      "blockPublicAccess": {
                          "ignorePublicAcls": false,
                          "restrictPublicBuckets": false,
                          "blockPublicAcls": false,
                          "blockPublicPolicy": false
                      }
                  },
                  "accountLevelPermissions": {
                      "blockPublicAccess": {
                          "ignorePublicAcls": false,
                          "restrictPublicBuckets": false,
                          "blockPublicAcls": false,
                          "blockPublicPolicy": false
                      }
                  }
              },
              "effectivePermission": "PUBLIC"
          }
      },
      "s3Object": {
          "bucketArn": "arn:aws:s3:::bucket-sample",
          "key": "2021/01/17191133/Camping-Checklist-Google-Docs.pdf",
          "path": "bucket-sample/2021/01/17191133/Camping-Checklist-Google-Docs.pdf",
          "extension": "pdf",
          "lastModified": "2021-01-17T22:11:34Z",
          "eTag": "e8d990704042d2e1b7bb504fb5868095",
          "versionId": "isqHLkSsQUMbbULNT2nMDneMG0zqitbD",
          "serverSideEncryption": {
              "encryptionType": "AES256"
          },
          "size": "150532",
          "storageClass": "STANDARD",
          "tags": [],
          "publicAccess": true
      }
  },
  "category": "CLASSIFICATION",
  "classificationDetails": {
      "jobArn": "arn:aws:macie2:us-west-2:123412341341:classification-job/d6cf41ccc7ea8daf3bd53ddcb86a2da5",
      "result": {
          "status": {
              "code": "COMPLETE"
          },
          "sizeClassified": "150532",
          "mimeType": "application/pdf",
          "sensitiveData": []
      },
      "detailedResultsLocation": "s3://bucket-macie/AWSLogs/123412341341/Macie/us-west-2/d6cf41ccc7ea8daf3bd53ddcb86a2da5/123412341341/50de3137-9806-3e43-9b6e-a6158fdb0e3b.jsonl.gz",
      "jobId": "d6cf41ccc7ea8daf3bd53ddcb86a2da5"
  }
}

다음 create table 문이 필요합니다.

CREATE EXTERNAL TABLE IF NOT EXISTS `macie`.`macie_bucket` (
    `schemaVersion` STRING,
    `id` STRING,
    `accountId` STRING,
    `partition` STRING,
    `region` STRING,
    `severity` STRUCT<
    `score`:STRING,
`description`:STRING>,
    `createdAt` STRING,
    `resourcesAffected` STRUCT<
    `s3Bucket`:STRUCT<
    `arn`:STRING,
`name`:STRING,
`createdAt`:STRING,
`owner`:STRUCT<
    `displayName`:STRING,
`id`:STRING>,
`defaultServerSideEncryption`:STRUCT<
    `encryptionType`:STRING>,
`publicAccess`:STRUCT<
    `permissionConfiguration`:STRUCT<
    `bucketLevelPermissions`:STRUCT<
    `accessControlList`:STRUCT<
    `allowsPublicReadAccess`:BOOLEAN,
`allowsPublicWriteAccess`:BOOLEAN>,
`bucketPolicy`:STRUCT<
    `allowsPublicReadAccess`:BOOLEAN,
`allowsPublicWriteAccess`:BOOLEAN>,
`blockPublicAccess`:STRUCT<
    `ignorePublicAcls`:BOOLEAN,
`restrictPublicBuckets`:BOOLEAN,
`blockPublicAcls`:BOOLEAN,
`blockPublicPolicy`:BOOLEAN>>,
`accountLevelPermissions`:STRUCT<
    `blockPublicAccess`:STRUCT<
    `ignorePublicAcls`:BOOLEAN,
`restrictPublicBuckets`:BOOLEAN,
`blockPublicAcls`:BOOLEAN,
`blockPublicPolicy`:BOOLEAN>>>,
`effectivePermission`:STRING>>,
`s3Object`:STRUCT<
    `bucketArn`:STRING,
`key`:STRING,
`path`:STRING,
`extension`:STRING,
`lastModified`:STRING,
`eTag`:STRING,
`versionId`:STRING,
`serverSideEncryption`:STRUCT<
    `encryptionType`:STRING>,
`size`:STRING,
`storageClass`:STRING,
`publicAccess`:BOOLEAN>>,
    `category` STRING,
    `classificationDetails` STRUCT<
    `jobArn`:STRING,
`result`:STRUCT<
    `status`:STRUCT<
    `code`:STRING>,
`sizeClassified`:STRING,
`mimeType`:STRING>,
`detailedResultsLocation`:STRING,
`jobId`:STRING>)
ROW FORMAT SERDE 
     'org.openx.data.jsonserde.JsonSerDe'
LOCATION
     's3://awsexamplebucket1-logs/AWSLogs/'

AWS Athena용 중첩된 JSON 파일에서 테이블을 생성하는 방법에 대한 Amazon의 자세한 내용은 다음 링크를 참조하십시오.https://aws.amazon.com/blogs/big-data/create-tables-in-amazon-athena-from-nested-json-and-mappings-using-jsonserde/

언급URL : https://stackoverflow.com/questions/11479247/how-do-you-make-a-hive-table-out-of-json-data

반응형