대부분의 문제는 파일 인덱싱이 DataFrame을로드하는 첫 번째 단계로 발생해야한다는 것입니다. spark.read.parquet
은 4000 개의 작업을 실행하므로 많은 파티션 폴더가있을 것이라고 말했습니까? Spark은 HDFS 디렉토리 목록을 얻고 각 폴더의 모든 파일을 재귀 적으로 FileStatus
(크기 및 분할)으로 가져옵니다. 효율성을 위해 Spark는 파일을 병렬로 인덱싱하므로 최대한 빨리 코어를 만들 수 있도록하려는 것입니다. 읽으려는 폴더에서 더 명시적일 수도 있고, 파킹 (parquet) 데이터 소스 테이블을 데이터 위에 정의하여로드 할 때마다 파티션 검색을 피할 수 있습니다. 이 시점에서
spark.sql("""
create table mydata
using parquet
options(
path 'hdfs://192.168.111.70/u01/dw/prod/stage/br/ventas/201711*/*'
)
""")
spark.sql("msck repair table mydata")
, 당신은 데이터를 쿼리 할 때 더 이상 파티션 검색을 할 필요가 없습니다,하지만 여전히 당신은 쿼리 폴더 내의 파일에 대한
FileStatus
을 얻을해야합니다. 새 파티션을 추가하는 경우 파티션을 명시 적으로 추가하여
repair table
spark.sql("""
alter table mydata add partition(foo='bar')
location 'hdfs://192.168.111.70/u01/dw/prod/stage/br/ventas/201711/foo=bar'
""")