1

df이라는 DataFrame이 있다고 가정 해보십시오. 파일이 디렉토리 example에, 나는 두 개의 파일과 디렉토리를 참조 (만들어 졌는지 여부를 확인하기 위해 나는이 작업을 수행 할 때, 그러나Spark SQL 데이터 프레임을 저장하려고하면 빈 디렉토리가 항상 나타납니다.

df.coalesce(1). 
    write. 
    format("com.databricks.spark.csv"). 
    option("header", "true"). 
    parquet("example") 
} 

을 가서 : 나는 로컬로 저장하려고 다음 명령을 실행하여

_SUCCESS ._SUCCESS.crc

가 어떻게이 DataFrame 제대로 파일을 저장할 수 있습니까?

것이 중요 경우

, 나는 또한 내가 로컬 말할 때, 그래서 본질적으로 Jupyter 노트북을 통해이 일을하고, 나는 의미 저장해 Jupyter Notebook 서버에서, Spark가 실행되고있는 곳이 아닌 곳 (Spark이 다른 마스터 노드를 가리키고 있음).

답변

1

것은 (내가 추측하고있어 이후 당신은 CSV 형식으로 출력을 원하는 마루되지 않음) 저장과 마루를 교체하십시오

이 시도 :

df.coalesce(1). 
    write. 
    format("com.databricks.spark.csv"). 
    option("header", "true"). 
    save("example") 
} 
+0

이전에 시도해 보았습니다. 그 경우에는 제목이 약간 오도 된 경우에는 죄송합니다. 나는 또한 단순화를 위해 쪽모이 세공을하려고했습니다. 불행히도, 나는 여전히 빈 디렉토리를 얻는다. –

+0

헤더 옵션 제거에 도움이되는지 확인하십시오. csv 형식의 옵션이 예상대로 작동하지 않는 경우가 있음을 기억합니다. –

3

을 그것이 나오는 것에 따라, 스파크는 모든 파일 작업을 수행 Hadoop을 통해 실행되며, 실행되는 모든 노드에서 디렉토리의 복사본을 만들 것이며 명령을 실행하는 노드는 보유한 데이터의 일부만 저장합니다.

DataFrame에서 "coalesce (1)"또는 "repartition (1)"을 사용하여 노드가 모든 데이터를 수집하도록 할 수 있지만 어떤 노드가 단일 파티션을 받는지 제어 할 수는 없습니다.

결과적으로 데이터 세트의 파티션이없는 노드 (예 : 드라이버)는 작업이 성공적임을 나타내는 "_SUCCESS"파일 만 갖습니다. 데이터를 다른 임의의 노드에 배치해야합니다.

이 문제는 직접 해결할 수 없었지만 HDFS와 같은 분산 파일 시스템을 사용하면 해결할 수 있습니다.

0

가장 간단한 해결책은 로컬 모드에서 스파크를 실행하는 것입니다. 이렇게하면 로컬에서 저장할 수 있지만 클러스터에서 실행되는 spark의 주요 이점을 상실하기 때문에 분명히 원하는 것은 아닐 수 있습니다.

HDFS에 저장 한 다음 출력을 로컬 디렉토리에 복사하는 것이 가장 좋습니다.

관련 문제