2017-10-01 1 views
0

우리의 ETL Hive 스크립트 중 하나를 Spark로 전환하려고합니다. Hive ETL 스크립트는 새 동기화 전에 매일 밤 데이터 일부를 삭제해야하는 테이블을 유지 관리합니다. Hive ETL은 주 테이블을 사용하여 삽입 덮어 쓰기를 사용하여 3 일 이상 데이터를 삭제합니다. 기본적으로 3 일 이상 경과하지 않은 데이터로 임시 테이블을 만든 다음 주 테이블을 덮어 씁니다.어떻게 스파크를 사용하여 삽입 덮어 쓰기를 수행 할 수 있습니까?

Spark (스칼라 사용)에서는 동일한 소스에 쓸 수없는 오류가 계속 발생합니다. 여기에 내 코드가있다 :

spark.sql ("Select * from mytbl_hive where dt > date_sub(current_date, 3)").registerTempTable("tmp_mytbl") 

val mytbl = sqlContext.table("tmp_mytbl") 
mytbl.write.mode("overwrite").saveTableAs("tmp_mytbl") 

//writing back to Hive ... 

mytbl.write.mode("overwrite").insertInto("mytbl_hive") 

내가 읽고있는 테이블에 쓸 수 없다는 오류가 발생한다.

누구든지이 작업을 수행하는 더 좋은 방법을 알고 있습니까?

답변

2

수 없습니다. Spark은 분명히 쿼리의 소스로 사용되는 테이블 덮어 쓰기를 금지합니다. 기술에 따라 몇 가지 해결 방법이 있지만 신뢰할 수 없으므로 피해야합니다. 대신

: 임시 테이블에

  • 쓰기 데이터.
  • 오래된 테이블을 버리십시오.
  • 임시 테이블 이름을 바꿉니다.

하이브 ETL 메인 테이블을 얻어보다 큰 일에 삽입 중첩하여 데이터를 삭제한다.

날짜별로 데이터를 파티션하고 데이터를 보지 않고 파티션을 삭제하는 것이 좋습니다.

관련 문제