2016-12-08 2 views
0

스파크에서 생성 된 데이터의 상단에 하이브 테이블을 만듭니다이 같은 스파크에서 ORC 형식으로 데이터를 생성 한

이제
var select: String = "SELECT ..." 
sqlContext.sql(select).write.format("orc").save("/tmp/out/20160101") 
select = "SELECT ..." 
sqlContext.sql(select).write.format("orc").save("/tmp/out/20160102") 
& so on... 

다음과 같이 내가 하이브에서 외부 테이블을 만들려고 오전 :

CREATE EXTERNAL TABLE `mydb.mytable` 
(`col1` string, 
    `col2` decimal(38,0), 
    `create_date` timestamp, 
    `update_date` timestamp) 
    PARTITIONED BY (`my_date` string) 
    STORED AS ORC 
    LOCATION '/tmp/out/'; 

내가 할 경우 :

"select count(*) from mydb.mytable"

내가 0로 카운트 값을 얻을그러나 스파크 쉘에서, 나는 실행하면 예상대로

val results = sqlContext.read.format("orc").load("/tmp/out/*/part*") 
results.registerTempTable("results") 
sqlContext.sql("select count(*) from results").show 

나는 50 개 행을 얻을.

'파티션'이 인식되지 않는 것처럼 보입니다. Spark에서 생성 된 데이터 위에 '외부'하이브 테이블을 만들려면 어떻게해야합니까?

+0

당신이 데이터를 찾을 수 하이브를 말하는 것'/ tmp를/출력/my_date = '하지만 스파크에서 아웃/' – puhlen

+0

흠 ... 내가 하이브를 알 수있는 방법 보는 /'/ tmp로 저장하는/tmp/out//tmp/out/my_date = 에 없습니까? 차라리 출력 위치를 변경하지 않을 것입니다. – DilTeam

+0

내가 아는 한 너는하지 않는다. ' = '은 하이브 파티션 디렉토리 이름의 형식입니다. 그것을 따르도록 스파크의 출력을 변경하십시오. – puhlen

답변

1

하이브가 자동으로 새 파티션을 찾지 않습니다. 새 파티션을 만든 후 하이브 테이블을 업데이트해야합니다. 하나의 파티션이 만들어져 하이브 테이블에 추가되면 원하는대로 해당 파티션 내의 파일을 추가 및 제거 할 수 있으며 이러한 변경 사항은 메타 스토어를 업데이트 할 필요없이 즉시 반영됩니다.

ALTER TABLE 쿼리를 사용하여 메타 스토어에 새 파티션을 만들 수 있습니다.

ALTER TABLE mydb.mytable 
ADD PARTITION (my_date='20160101') 
LOCATION '/tmp/out/20160101' 

하이브가 가져올 수 있도록 모든 출력 디렉터리에 대해이 쿼리를 수행해야합니다.

그러나 Hive의 파티션 이름은 <column_name>=<value>입니다. 이 명명 체계를 사용하면 몇 가지 장점이 있습니다. 먼저 ALTER TABLE 쿼리에서 LOCATION 절을 생략 할 수 있지만 다른 쿼리 (MSCK REPAIR TABLE <table_name>)를 사용하면 모든 디렉터리를 파티션으로 분할하여 메타 스토어에 추가 할 수 있습니다. 이것은 여러 파티션을 동시에 추가하려는 경우에 유용하며 추가중인 모든 파티션 열의 값을 알 필요가 없다는 것을 의미합니다.

+0

아니요./tmp/out/my_date = 20160101이 작동하지 않습니다. 나는 ALTER TABLE을 시도하고 볼 것이다. – DilTeam

+0

이 작업 내용 : ALTER TABLE'mydb.mytable' ADD PARTITION (my_date = 20160101) LOCATION '/ tmp/out/20160101'; 답변에 오타를 수정하십시오. 감사. – DilTeam

+0

사실, 날짜 주위에'(틱)을 넣는 것이 작동하지 않지만 my_date = 20160101이 효과가있었습니다. YMMV. – DilTeam