2017-02-18 7 views
12

나는 다음과 같이 세 개의 열 값에 의해 분할, DataFrameWriter를 사용하여 마루 형식으로 HDFS에 DataFrame을 저장하려고 :새로운 데이터가없는 파티션을 삭제하지 않고 Spark에서 DataFrame을 파티션 분할하고 쓰는 방법은 무엇입니까?

this question에서 언급 한 바와 같이
dataFrame.write.mode(SaveMode.Overwrite).partitionBy("eventdate", "hour", "processtime").parquet(path) 

partitionBypath에서 파티션의 전체 기존의 계층 구조를 삭제하고 dataFrame의 파티션으로 바 꾸었습니다. 특정 날에 대한 새로운 증분 데이터가 주기적으로 들어올 것이므로, 내가 원하는 것은 dataFrame에 대한 데이터가있는 계층 구조의 파티션 만 바꾸고 다른 파티션은 그대로 둡니다.

은 내가 개별적으로 전체 경로, 이런 식으로 뭔가를 사용하여 각 파티션을 저장할 필요가 나타납니다 이렇게하려면 다음을 수행

singlePartition.write.mode(SaveMode.Overwrite).parquet(path + "/eventdate=2017-01-01/hour=0/processtime=1234567890") 

그러나 나는 문제가 단일 파티션으로 데이터를 구성하는 가장 좋은 방법을 이해하는 데 문제가 있습니다 DataFrame 그래서 전체 경로를 사용하여 작성할 수 있습니다.

dataFrame.repartition("eventdate", "hour", "processtime").foreachPartition ... 

그러나 foreachPartition 마루 형식으로 작성하는 적합하지 않은 Iterator[Row]에서 작동 : 하나 개의 아이디어는 무엇인가 같았다.

또한 select...distinct eventdate, hour, processtime을 사용하여 파티션 목록을 얻은 다음 원본 데이터 프레임을 각 파티션별로 필터링하고 전체 파티션 경로에 결과를 저장하는 것으로 생각했습니다. 그러나 개별적인 쿼리와 각 파티션에 대한 필터는 많은 필터/쓰기 작업이 될 것이므로 매우 효율적으로 보이지 않습니다.

dataFrame에 데이터가없는 기존 파티션을 보존하는 더 깨끗한 방법이 있기를 바랍니다.

읽어 주셔서 감사합니다.

스파크 버전 : 2.1

답변

0

모드를 추가로 시도 할 수 있습니다.

dataFrame.write.format("parquet") 
.mode("append") 
.partitionBy("year","month") 
.option("path",s"$path/table_name") 
.saveAsTable(s"stg_table_name") 
1

모드 옵션 Append에 캐치가 있습니다!

df.write.partitionBy("y","m","d") 
.mode(SaveMode.Append) 
.parquet("/data/hive/warehouse/mydbname.db/" + tableName) 

기존의 파티션 파일을 테스트 할 때 테스트되었습니다. 그러나 이번에는 다음과 같은 문제가 있습니다. 같은 코드를 두 번 (동일한 데이터로) 실행하면 동일한 데이터 (기존 1.6)에 대해 기존의 파일을 바꾸는 대신 새 마루 파일을 만듭니다. 따라서 Append을 사용하는 대신 Overwrite으로이 문제를 해결할 수 있습니다. 테이블 레벨에서 겹쳐 쓰는 대신 파티션 레벨에서 겹쳐 써야합니다.

df.write.mode(SaveMode.Overwrite) 
.parquet("/data/hive/warehouse/mydbname.db/" + tableName + "/y=" + year + "/m=" + month + "/d=" + day) 

은 자세한 내용은 다음 링크를 참조하십시오 :

Overwrite specific partitions in spark dataframe write method

(나는 suriyanto의 발언 후 내 대답을 업데이 트했습니다 Thnx..) 같은를 쓸 때 경우

+0

이 테스트나요 이전 파티션을 대체하는 데이터를 두 번? 내 테스트에서, 실제로 파티션 디렉토리 안에 새로운 쪽모이 한 파일을 만들어서 데이터를 두 배로 만듭니다. 나는 스파크 2.2에있다. – suriyanto