데이터 집합을 만들고이 파일을 s3에 ${BasePath}/y=2107/m=11/d=16/
쪽 마루 형식으로 쓰려고합니다. 오늘 날짜의 데이터를 작성한 다음 s3에 기록한 후 지난 10 일 동안 데이터를 다시 읽어야합니다.쓰기 및 다시 읽을 때 스파크가 누락 됨
dataset.write.mode(SaveMode.Overwrite)
.format(sourceConfig.format).save(getWriteBasePath(sourceConfig.sourcePath
, replaceDate))
newDf = spark.read.parquet("path1",...,"path9").union(dataset)
두번째 접근법처럼, 9 일 개 데이터의 나머지 부분을 읽어와 노동 조합을, S3에 현재 날짜 데이터 쓰기 : 쓰기
나는이 작업을 수행 할 수있는 2 가지 방법,
1 접근입니다 현재 날짜 데이터를 s3으로 변경하고 모든 10 일 데이터를 다시 읽습니다. 같은 뭔가 :
dataset.write.mode(SaveMode.Overwrite)
.format(sourceConfig.format).save(getWriteBasePath(sourceConfig.sourcePath
, replaceDate))
newDf = spark.read.parquet("path1",...,"path10")
첫번째 접근 방식은 문제없이 작업 하지만 두번째 방법에 비해 매우 느립니다. 하지만 두 번째 방법을 사용하면 전체 데이터를 다시 읽은 후 현재 열의 일부가 null 값을 얻게됩니다. 나는 기록 된 당일의 자료가 적절하다는 것을 확인했다.
왜 이런 일이 발생하는지 알 수 없습니다. 나는 다음과 같은 특성을 가진 스파크 컨텍스트를 만드는 오전 :
sparkSession.sparkContext.hadoopConfiguration.set("mapreduce.fileoutputcommitter.algorithm.version", "2")
sparkSession.sparkContext.getConf.set("spark.hadoop.parquet.enable.summary-metadata", "false")
sparkSession.sparkContext.getConf.set("spark.sql.parquet.mergeSchema", "false")
sparkSession.sparkContext.getConf.set("spark.sql.parquet.filterPushdown", "true")
sparkSession.sparkContext.getConf.set("spark.sql.hive.metastorePartitionPruning", "true")
_ "일부 열 ..."_ ?? 어떤 열이 널 값을 얻고 있습니까? –
@ GlennieHellesSindholt 일부 20 열 중 열 15 및 열 16 값이 모두 null입니다. 다른 모든 열은 적절한 값을가집니다. –
논리적으로 첫 번째 방법은 디스크에서 적은 양의 데이터를 읽을 때 더 빨리 작동해야합니다. 그 2 cols에 대한 null 값만로드하기 때문에 더 빨리 작동합니다. 당신이 다루고있는 데이터의 크기는 얼마입니까? 이 두 열의 데이터가 상당한 크기 인 경우 두 번째 방법은이 데이터를로드하지 않아 빠르게 실행됩니다. – Phoenix