복붙노트

[HADOOP] 하이브로 JSON 배열을 가져

HADOOP

하이브로 JSON 배열을 가져

나는 하이브에서 다음 JSON을 가져 오기 위해 노력하고있어

CREATE TABLE json_serde (
 s array<struct<time: timestamp, latitude: string, longitude: string, pm1: string>>)
 ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
 WITH SERDEPROPERTIES (
     'mapping.value' = 'value'
 )
 STORED AS TEXTFILE
location '/user/hduser';

가져 오기 작업은하지만 난 시도하는 경우

Select * from json_serde;

이 파일 당 하둡 / 사용자 / hduser 첫 번째 요소에있는 모든 문서에서 돌아갑니다.

JSON 배열 작업에 대한 좋은 문서가있다?

해결법

  1. ==============================

    1.내가 당신에게 또 다른 접근 방식을 제안 할 경우 단지 외부 테이블에 문자열 데이터 형식으로 열로 전체 JSON 문자열을로드합니다. 유일한 제한은 제대로 종료 라인을 정의하는 것입니다. 예를 들면 한 줄에 각 JSON을 가질 수 있다면, 당신은 다음과 같이 테이블을 생성 할 수 있습니다 :

    내가 당신에게 또 다른 접근 방식을 제안 할 경우 단지 외부 테이블에 문자열 데이터 형식으로 열로 전체 JSON 문자열을로드합니다. 유일한 제한은 제대로 종료 라인을 정의하는 것입니다. 예를 들면 한 줄에 각 JSON을 가질 수 있다면, 당신은 다음과 같이 테이블을 생성 할 수 있습니다 :

    EG

    CREATE EXTERNAL TABLE json_data_table (
        json_data String
        )   
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\u0001' LINES TERMINATED BY '\n' STORED AS TEXTFILE 
    LOCATION '/path/to/json';
    

    사용 하이브는 개별 열을 추출 get_json_object. 이 일예로 JSON 문자열로 쿼리 같은 지원 기본 XPath를 명령

    json_data 열은 JSON 문자열 아래에있는 경우

    {"store":
      {"fruit":\[{"weight":8,"type":"apple"},{"weight":9,"type":"pear"}],
       "bicycle":{"price":19.95,"color":"red"}
      },
     "email":"amy@only_for_json_udf_test.net",
     "owner":"amy"
    }
    

    아래의 쿼리를 가져옵니다

    SELECT get_json_object(json_data, '$.owner') FROM json_data_table;
    

    반환 에이미

    이러한 방법으로 당신은 테이블에서 열 각 JSON 요소를 추출 할 수 있습니다.

  2. ==============================

    2.당신은 구조체의 배열을 가지고있다. 당신이 붙여 넣기 만 한 줄입니다.

    당신은 구조체의 배열을 가지고있다. 당신이 붙여 넣기 만 한 줄입니다.

    당신이 모든 요소를보고 싶다면, 당신은 인라인을 사용할 필요가

    SELECT inline(s) FROM json_table;
    

    다른 방법으로는 해당 배열 내의 각 객체가 파일의 한 줄에 하나의 JSON 객체가되도록 파일을 다시 작성해야

    또한, 나는 데이터에 값 필드가 표시되지 않습니다, 그래서 당신이 serde 속성에 매핑하는지 모르겠어요

  3. ==============================

    3.당신이 제공하는 JSON이 올바르지 않습니다. JSON은 항상 여는 중괄호로 시작 "{"와 종료 중괄호로 끝나는 "}". 그래서, 여기에 가장 먼저 살펴보아야 할 것은 당신의 JSON은 잘못된 것입니다.

    당신이 제공하는 JSON이 올바르지 않습니다. JSON은 항상 여는 중괄호로 시작 "{"와 종료 중괄호로 끝나는 "}". 그래서, 여기에 가장 먼저 살펴보아야 할 것은 당신의 JSON은 잘못된 것입니다.

    귀하의 JSON은 아래와 같이 있었어야 :

    {"key":[{"key1":"value1","key2":"value2"},{"key1":"value1","key2":"value2""},{"key1":"value1","key2":"value2"}]}
    

    그리고, 두 번째 것은 당신이 타임 스탬프로 "시간"필드의 데이터 형을 선언 한 것입니다. 그러나 데이터 (1521115600)은 밀리 초 단위입니다. 타임 스탬프 데이터 유형 포맷 YYYY-MM-DD HH 데이터를 필요 : MM : SS [.fffffffff].

    그래서, 당신의 데이터는 이상적으로 다음 형식이어야합니다 :

    지금, 당신은 테이블에서 레코드를 선택하는 쿼리를 사용할 수 있습니다.

    hive> select * from json_serde;
    OK
    [{"time":"1970-01-18 20:01:55","latitude":"44.3959","longitude":"26.1025","pm1":"21.70905"},{"time":"1970-01-18 20:01:55","latitude":"44.3959","longitude":"26.1025","pm1":"24.34045"},{"time":"1970-01-18 20:01:55","latitude":"44.3959","longitude":"26.1025","pm1":"23.6826"},{"time":"1970-01-18 20:01:55","latitude":"44.3959","longitude":"26.1025","pm1":"25.65615"}]
    Time taken: 0.069 seconds, Fetched: 1 row(s)
    hive>
    

    별도로 표 형식으로 표시되는 각 값을 원하는 경우에, 당신은 아래의 쿼리를 사용할 수 있습니다.

    select b.* from json_serde a lateral view outer inline (a.myjson) b;
    

    위의 쿼리의 결과는 다음과 같다 :

    +------------------------+-------------+--------------+-----------+--+
    |         b.time         | b.latitude  | b.longitude  |   b.pm1   |
    +------------------------+-------------+--------------+-----------+--+
    | 1970-01-18 20:01:55.0  | 44.3959     | 26.1025      | 21.70905  |
    | 1970-01-18 20:01:55.0  | 44.3959     | 26.1025      | 24.34045  |
    | 1970-01-18 20:01:55.0  | 44.3959     | 26.1025      | 23.6826   |
    | 1970-01-18 20:01:55.0  | 44.3959     | 26.1025      | 25.65615  |
    +------------------------+-------------+--------------+-----------+--+
    

    아름다운. 그렇지?

    해피 학습.

  4. ==============================

    4.당신이 당신의 입력 파일 형식을 업데이트 사용할 수없는 경우 직접 불꽃에 가져올 수 및 데이터 다시 하이브 테이블에 쓰기 완료되면, 그것을 사용할 수 있습니다.

    당신이 당신의 입력 파일 형식을 업데이트 사용할 수없는 경우 직접 불꽃에 가져올 수 및 데이터 다시 하이브 테이블에 쓰기 완료되면, 그것을 사용할 수 있습니다.

    scala> val myjs = spark.read.format("json").option("path","file:///root/tmp/test5").load()
    myjs: org.apache.spark.sql.DataFrame = [altitude: bigint, gas1: bigint ... 13 more fields]
    
    scala> myjs.show()
    +--------+----+----+----+----+--------+--------+---------+-----+--------+--------+----+--------+-----------+----------+
    |altitude|gas1|gas2|gas3|gas4|humidity|latitude|longitude|noise|     pm1|    pm10|pm25|pressure|temperature|      time|
    +--------+----+----+----+----+--------+--------+---------+-----+--------+--------+----+--------+-----------+----------+
    |      53|   0|0.12|   0|   0|       0| 44.3959|  26.1025|    0|21.70905|14.60085|16.5|       0|       null|1521115600|
    |      53|   0|0.08|   0|   0|       0| 44.3959|  26.1025|    0|24.34045|16.37065|18.5|       0|       null|1521115659|
    |      53|   0| 0.0|   0|   0|       0| 44.3959|  26.1025|    0| 23.6826| 15.9282|18.0|       0|       null|1521115720|
    |      53|   0|0.04|   0|   0|       0| 44.3959|  26.1025|    0|25.65615|17.25555|19.5|       0|       null|1521115779|
    +--------+----+----+----+----+--------+--------+---------+-----+--------+--------+----+--------+-----------+----------+
    
    
    scala> myjs.write.json("file:///root/tmp/test_output")
    

    또는 직접 표를 하이브 수 있습니다

       scala> myjs.createOrReplaceTempView("myjs")
    
        scala> spark.sql("select * from myjs").show()
    
        scala> spark.sql("create table tax.myjs_hive as select * from myjs")
    
  5. from https://stackoverflow.com/questions/49302628/importing-json-array-into-hive by cc-by-sa and MIT license