2016-10-05 3 views
2

분할 된 데이터 집합을 쓰고 복원하는 방법을 찾고 있습니다. 이 질문의 목적을 위해 내가 모두 RDD을 분할 받아 들일 수 :안정적으로 분할 된 데이터를 쓰고 복원하는 방법

val partitioner: org.apache.spark.Partitioner = ??? 
rdd.partitionBy(partitioner) 

Dataset[Row]/Dataframe :

df.repartition($"someColumn") 

목표는 데이터를 복원 할 때 셔플을 방지하는 것입니다. 내가 쓰기 엔 나무 마루에 Dataset 분할에 대해 생각하지만 난 그 불꽃이 정보를 사용하지 않습니다 생각

spark.read.parquet(path).repartition(m, $"id") 

예를 들어 : 대한

spark.range(n).withColumn("foo", lit(1)) 
    .repartition(m, $"id") 
    .write 
    .partitionBy("id") 
    .parquet(path) 

는 셔플 할 필요가 없습니다.

데이터베이스 또는 데이터 그리드가 아닌 디스크 스토리지에서만 작업 할 수 있습니다.

답변

3

아마도 dataframe/dataset API의 bucketBy에 의해 달성 될 수 있지만 catch가 있습니다. 마루에 직접 저장하면 saveAsTable 만 작동합니다.

Dataset<Row> parquet =...; 
parquet.write() 
    .bucketBy(1000, "col1", "col2") 
    .partitionBy("col3") 
    .saveAsTable("tableName"); 

sparkSession.read().table("tableName"); 

스파크 코어에 대한 또 다른 apporach는 예를 들어 https://github.com/apache/spark/pull/4449보고, RDD 사용자 정의 사용하는 것입니다 - HDFS를 읽은 후, 즉 다시 설치 파티션 프로그램의 종류를 RDD하지만 조금 해키와 기본적으로 지원하지 (그래서 조정해야 모든 불꽃 버전)

+0

@LosInOverflow, 그래서 당신을 위해 작동하지 않니? 너는 동의하지 않니? –

+0

솔직히 말해서 솔직히 말해서 나는 여전히 계획에서 혼란 스럽다 .RDD 솔루션은 흥미롭지 만 해킹 할 방법이 없다. 그러나 오늘 유일한 운이 좋다. :) –

+0

@LostInOverflow, 확인 방법을 게시 할 수 있습니까? –

관련 문제