복붙노트

[HADOOP] 하이브 : CSV 파일에 포함 된 JSON 열을 분해하는 방법은 무엇입니까?

HADOOP

하이브 : CSV 파일에 포함 된 JSON 열을 분해하는 방법은 무엇입니까?

CSV 파일 (헤더 및 파이프 구분 기호 포함)에서 JSON 열 (컬렉션 내부)이 포함 된 다음 두 가지 내용이 있습니다.

첫 번째 경우 (이름이없는 JSON 컬렉션) :

ProductId|IngestTime|ProductOrders
9180|20171025145034|[{"OrderId":"299","Location":"NY"},{"OrderId":"499","Location":"LA"}]
8251|20171026114034|[{"OrderId":"1799","Location":"London"}]

두 번째 경우 ( 'Orders'라는 JSON 컬렉션 사용) :

ProductId|IngestTime|ProductOrders
9180|20171025145034|{"Orders":[{"OrderId":"299","Location":"NY"},{"OrderId":"499","Location":"LA"}]}
8251|20171026114034|{"Orders":[{"OrderId":"1799","Location":"London"}]}

먼저 다음과 같이 "원시"테이블을 만듭니다.

DROP TABLE IF EXISTS Product;
CREATE EXTERNAL TABLE Product (
  ProductId STRING,
  IngestTime STRING,
  ProductOrders STRING
)
COMMENT "Product raw table"
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\|'
STORED AS TEXTFILE
LOCATION
  '/data/product'
TBLPROPERTIES ("skip.header.line.count"="1");

내가 테이블을 쿼리 할 때 :

SELECT * FROM Product

다음과 같은 대답이 있습니다.

첫 번째 경우 (이름이없는 JSON 컬렉션) :

ProductId  IngestTime      ProductOrders
9180       20171025145034  [{"OrderId":"299","Location":"NY"},{"OrderId":"499","Location":"LA"}]
8251       20171026114034  [{"OrderId":"1799","Location":"London"}]

두 번째 경우 ( 'Orders'라는 JSON 컬렉션 사용) :

ProductId  IngestTime      ProductOrders
9180       20171025145034  {"Orders":[{"OrderId":"299","Location":"NY"},{"OrderId":"499","Location":"LA"}]}
8251       20171026114034  {"Orders":[{"OrderId":"1799","Location":"London"}]}

좋아, 지금까지는 잘 작동합니다!

그러나 지금 필요한 것은 다음을 반환하는 SELECT 쿼리를 만드는 것입니다.

ProductId  IngestTime      ProductOrderId ProductLocation
9180       20171025145034  299            NY
9180       20171025145034  499            LA
8251       20171026114034  1799           London

실제로 두 가지 경우 ( "OrderId"태그가 있거나없는)에 적합한 휴대용 SQL 쿼리가 필요합니다.

지금까지 'explode', 'get_json_object'등을 사용하여 많은 조합을 시도했지만 여전히 올바른 SQL 쿼리를 찾지 못했습니다.

도와 주셔서 정말로 고맙습니다 :-)

해결법

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

    1.당신은 시도 할 수 있습니다

    당신은 시도 할 수 있습니다

    CREATE EXTERNAL TABLE product(productid String,ingesttime String, productorders array<struct<orderid:String,location:string>> ) 
    
    select productid,ingesttime, productorders.orderid[0] as orderid , productorders.location[0] as location from product
    

  2. from https://stackoverflow.com/questions/46935265/hive-how-to-explode-a-json-column-embedded-in-a-csv-file by cc-by-sa and MIT license