나는 다음과 같이 세 개의 열 값에 의해 분할, DataFrameWriter
를 사용하여 마루 형식으로 HDFS에 DataFrame
을 저장하려고 :새로운 데이터가없는 파티션을 삭제하지 않고 Spark에서 DataFrame을 파티션 분할하고 쓰는 방법은 무엇입니까?
dataFrame.write.mode(SaveMode.Overwrite).partitionBy("eventdate", "hour", "processtime").parquet(path)
이 partitionBy
가 path
에서 파티션의 전체 기존의 계층 구조를 삭제하고 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
이 테스트나요 이전 파티션을 대체하는 데이터를 두 번? 내 테스트에서, 실제로 파티션 디렉토리 안에 새로운 쪽모이 한 파일을 만들어서 데이터를 두 배로 만듭니다. 나는 스파크 2.2에있다. – suriyanto