[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.내가 당신에게 또 다른 접근 방식을 제안 할 경우 단지 외부 테이블에 문자열 데이터 형식으로 열로 전체 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.당신은 구조체의 배열을 가지고있다. 당신이 붙여 넣기 만 한 줄입니다.
당신은 구조체의 배열을 가지고있다. 당신이 붙여 넣기 만 한 줄입니다.
당신이 모든 요소를보고 싶다면, 당신은 인라인을 사용할 필요가
SELECT inline(s) FROM json_table;
다른 방법으로는 해당 배열 내의 각 객체가 파일의 한 줄에 하나의 JSON 객체가되도록 파일을 다시 작성해야
또한, 나는 데이터에 값 필드가 표시되지 않습니다, 그래서 당신이 serde 속성에 매핑하는지 모르겠어요
-
==============================
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.당신이 당신의 입력 파일 형식을 업데이트 사용할 수없는 경우 직접 불꽃에 가져올 수 및 데이터 다시 하이브 테이블에 쓰기 완료되면, 그것을 사용할 수 있습니다.
당신이 당신의 입력 파일 형식을 업데이트 사용할 수없는 경우 직접 불꽃에 가져올 수 및 데이터 다시 하이브 테이블에 쓰기 완료되면, 그것을 사용할 수 있습니다.
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")
from https://stackoverflow.com/questions/49302628/importing-json-array-into-hive by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 하이브에서 모든 N-그램을 생성하는 방법 (0) | 2019.09.17 |
---|---|
[HADOOP] 인 IntelliJ를 사용하여 HDFS Kerberos를 클러스터에 로컬로 연결할 수 없습니다 (0) | 2019.09.17 |
[HADOOP] 하둡 하이브 바닐라에서이 오류를 수정하는 방법 (0) | 2019.09.17 |
[HADOOP] 하이브에서 파티션 컬럼으로 정상 열을 변환 (0) | 2019.09.17 |
[HADOOP] 정확히 매퍼 및 감속기 기능의 출력은 무엇입니까 (0) | 2019.09.17 |