2016-11-25 1 views
1

내가 JSON 파일에서 데이터를 읽고 파일을 마루에 작성하는 스파크 작업을 쓰고있는 경우 (마루 파일) 기록을 갱신, 아래의 예제 코드입니다 :스파크 이미

DataFrame dataFrame = new DataFrameReader(sqlContext).json(textFile); 
    dataFrame = dataFrame.withColumn("year", year(to_date(unix_timestamp(dataFrame.col("date"), "YYYY-MM-dd'T'hh:mm:ss.SSS").cast("timestamp")))); 
    dataFrame = dataFrame.withColumn("month", month(to_date(unix_timestamp(dataFrame.col("date"), "YYYY-MM-dd'T'hh:mm:ss.SSS").cast("timestamp")))); 
    dataFrame.write().mode(SaveMode.Append).partitionBy("year", "month").parquet("<some_path>"); 

JSON 파일은 많은 json 레코드로 구성되어 있으며 이미 존재하는 경우 여기 엔 나무 마루로 레코드를 업데이트하려고합니다. Append 모드를 시도했지만 레코드 수준이 아닌 파일 수준에서 작업하는 것으로 보입니다 (즉, 파일이 이미있는 경우, 결국 기록됩니다). 따라서 동일한 파일에 대해이 작업을 실행하면 레코드가 복제됩니다.

데이터 프레임 행 ID를 고유 키로 지정할 수있는 방법이 있습니까? 이미 존재하는 레코드를 업데이트하도록 spark에 요청하십시오. 모든 저장 모드는 파일이 아닌 레코드를 확인하는 것 같습니다.

답변

0

마루는 데이터베이스가 아닌 파일 형식이며, ID로 업데이트하려면 파일을 읽고, 새 파일에 데이터를 다시 쓰거나 (또는 ​​덮어 쓰는 것보다) 메모리의 값을 업데이트해야합니다. 기존 파일).

자주 발생하는 유스 케이스 인 경우 데이터베이스를 사용하는 것이 더 나을 것입니다. 당신은 HDFS의 상단에 체류하려는 경우 사용 사례를

https://orc.apache.org/docs/acid.html

에 따르면, 또는 HBase를 :

0

당신은 볼 대신 아파치 ORC 파일 형식을 볼 수있다.

그러나 HDFS는 한 번만 쓸 수있는 파일 시스템이므로 필요에 맞지 않으면 다른 파일 (아마도 elasticsearch, mongodb)로 이동하십시오.

그렇지 않으면 HDFS에서 매번 새 파일을 만들어야하며 "델타"파일을 작성한 다음 증분 프로세스를 설정하고 OLD + DELTA = NEW_DATA를 병합해야합니다.