Spark 완벽 가이드 ch9. 데이터소스

Q·2023년 1월 17일
0

Spark 완벽 가이드

목록 보기
10/24
  • 스파크 핵심 데이터소스

    • CSV
    • JSON
    • 파케이
    • ORC
    • JDBC/ODBC연결
    • 일반 텍스트 파일
  • 핵심 서드파티 데이터소스

    • 카산드라
    • HBase
    • 몽고디비
    • AWS Redshift
    • XML
path='/FileStore/tables/all/*.csv'  

데이터소스 API의 구조

읽기 API 구조

  • 스파크에서 데이터를 읽을 땐 기본적으로 DataFrameReader를 사용함
  • DataFrameReader는 SparkSession의 read 속성으로 접근
  • DataFrameReader를 얻고 나서는 다음과 같은 값을 지정해야함
    • format: 포맷 지정(default: 파케이)
    • option: 데이터 읽는 방법 지정 ex)키-값 쌍이면 option('key', 'value')
    • schema: 데이터 소스에서 스키마를 제공하거나 스키마 추론 기능을 사용하려고 할 때 지정
spark.read
Out[1]: <pyspark.sql.readwriter.DataFrameReader at 0x7f6b4e3e9f40>
df = spark.read.format('csv')\
.option('mode', 'FAILFAST')\
.option('inferSchema', 'true')\
.option('path', path)\
.load()
  • 위 예시에서는 읽기 모드를 'failfast'로 지정함
  • 읽기 모드: 스파크가 형식에 맞지 않는 데이터를 만났을 때의 동작 방식을 지정하는 옵션
    • permissive(default): 오류 레코드의 모든 필드를 null로 설정하고 모든 오류 레코드를 _corrupt_record라는 문자열 컬럼에 기록
    • dropMalformed: 형식에 맞지 않는 레코드가 포함된 로우 제거
    • failFast: 형식에 맞지 않는 레코드를 만나면 즉시 종료

쓰기 API 구조

  • 데이터 읽기와 매우 유사한데 DataFrameReader 대신 DataFrameWriter를 사용
  • 데이터소스에 항상 데이터를 기록해야하므로 DataFrame의 write속성을 사용
    • DataFrame별로 DataFrameWriter에 접근
  • DataFrameWriter를 얻고나서는 다음과 같은 값을 지정해야함
    • format
    • option
    • 파일 기반의 데이터소스만 해당
      • partitionBy
      • bucketBy
      • sortBy
df.write.format('csv')\
.option('mode', 'OVERWRITE')\
.option('dateFormat', 'yyyy-MM-dd')\
.option('path', '/FileStore/tables/temp/temp.csv')\
.save()
  • 위 예시에서는 저장 모드를 'overwrite'로 지정함
  • 저장 모드: 스파크가 지정된 위치에서 동일한 파일이 발견됐을 때의 동작 방식 지정
    • append: 해당 경로에 이미 존재하는 파일 목록에 결과 파일 추가
    • overwrite: 이미 존재하는 모든 데이터를 완전히 덮어씀
    • errorIfExists(default): 오류를 발생시키면서 쓰기 작업이 실패
    • ignore: 아무런 처리 X

CSV 파일 읽기

df =spark.read.format('csv')\
.option('header', 'true')\
.option('mode','FAILFAST')\
.load(path)
df.show(5)
+---------+---------+--------------------+--------+--------------+---------+----------+--------------+ 
InvoiceNo|StockCode| Description|Quantity| InvoiceDate|UnitPrice|CustomerID| Country| 
+---------+---------+--------------------+--------+--------------+---------+----------+--------------+ 
536365| 85123A|WHITE HANGING HEA...| 6|12/1/2010 8:26| 2.55| 17850|United Kingdom| 
536365| 71053| WHITE METAL LANTERN| 6|12/1/2010 8:26| 3.39| 17850|United Kingdom| 
536365| 84406B|CREAM CUPID HEART...| 8|12/1/2010 8:26| 2.75| 17850|United Kingdom| 
536365| 84029G|KNITTED UNION FLA...| 6|12/1/2010 8:26| 3.39| 17850|United Kingdom| 
536365| 84029E|RED WOOLLY HOTTIE...| 6|12/1/2010 8:26| 3.39| 17850|United Kingdom| 
+---------+---------+--------------------+--------+--------------+---------+----------+--------------+ 
only showing top 5 rows

CSV 파일 쓰기

df.write.format('csv').mode('overwrite').option('sep','\t').save('/FileStore/tables/temp/tsv_file.tsv')
  • 위처럼 csv파일을 읽어 들여 tsv파일로 내보는 처리도 간단

JSON 파일

  • 자바스크립트 객체 표기법(JavaScript Object Notation)
  • 스파크에서는 JSON파일을 사용할 때 줄로 구분된 JSON을 기본적으로 사용
    • 큰 JSON 객체나 배열을 하나씩 가지고 있는 파일을 다루는 것과 대조적인 부분
    • multiLine옵션으로 바꿀 순 있음
    • 근데 줄로 구분된 방식이 더 안정적이라서 디폴트임
      • 구조화 되어 있음
      • 최소한의 기본 데이터 타입이 존재함
  • JSON은 객체이므로 CSV보다 옵션 수가 적음

JSON 파일 읽기

j_path='/FileStore/tables/2010_summary.json'
spark.read.format('json').option('mode', 'FAILFAST').option('inferSchema', 'true').load(j_path).show(5)
+-----------------+-------------------+-----+
DEST_COUNTRY_NAME|ORIGIN_COUNTRY_NAME|count| 
+-----------------+-------------------+-----+ 
United States| Romania| 1| 
United States| Ireland| 264| 
United States| India| 69| 
Egypt| United States| 24| 
Equatorial Guinea| United States| 1| 
+-----------------+-------------------+-----+ 
only showing top 5 rows

JSON 파일 쓰기

df.write.format('json').mode('overwrite').save('/FileStore/tables/temp/j_file.json')
  • 데이터소스에 관계없이 json파일에 저장할 수 있음
  • 위처럼 csv DataFrame을 json파일의 소스로 재사용 가능

파케이 파일

  • 다양한 스토리지 최적화 기술을 제공하는 오픈소스로 만들어진 컬럼 기반의 데이터 저장 방식
  • 저장 공간 절약 가능
  • 전체 파일을 읽는 대신 개별 컬럼을 읽음
  • 컬럼 기반 압축 기능 제공
  • 아파치 스파크와 호환이 잘 됨
    • 그래서 스파크의 기본 파일 포맷
  • json이나 csv보다 읽기 연산이 더 효율적
  • 장기 저장용 데이터는 파케이 포맷으로 저장하는 것이 좋음
  • 복합 데이터 타입 지원
    • csv에서는 배열을 사용할 수 없음
  • 옵션이 거의 없음(2개)
    • 스파크 개념에 아주 잘 부합하고 알맞게 정의된 명세를 가지고 있기 때문
    • 링크

파케이 파일 읽기

p_path='/FileStore/tables/2010-summary.parquet'
spark.read.format('parquet').load(p_path).show(5)
+-----------------+-------------------+-----+
DEST_COUNTRY_NAME|ORIGIN_COUNTRY_NAME|count| 
+-----------------+-------------------+-----+ 
United States| Romania| 1| 
United States| Ireland| 264| 
United States| India| 69| 
Egypt| United States| 24| 
Equatorial Guinea| United States| 1| 
+-----------------+-------------------+-----+ 
only showing top 5 rows

파케이 파일 쓰기

df.write.format('parquet').mode('overwrite').save('/FileStore/tables/temp/p_file.parquet')
  • 다른 포맷과 동일

ORC 파일

  • ORC는 하둡 워크로드를 위해 설계된 자기 기술적(self-describing)이며 데이터 타입을 인식할 수 있는 컬럼 기반의 파일 포맷
  • 대규모 스트리밍 읽기에 최적화
  • 필요한 로우를 신속하게 찾아낼 수 있음
  • 스파크는 ORC파일 포맷을 별도의 옵션 지정 없이 효율적으로 사용 가능
  • 파케이와의 차이?
    • 파케이는 스파크에 최적화
    • ORC는 하이브에 최적화

ORC 파일 읽기

o_path='/FileStore/tables/2010-summary.orc/part_r_00000_2c4f7d96_e703_4de3_af1b_1441d172c80f_snappy.orc'
spark.read.format('orc').load(o_path).show(5)
+-----------------+-------------------+-----+
DEST_COUNTRY_NAME|ORIGIN_COUNTRY_NAME|count| 
+-----------------+-------------------+-----+ 
United States| Romania| 1| 
United States| Ireland| 264| 
United States| India| 69| 
Egypt| United States| 24| 
Equatorial Guinea| United States| 1| 
+-----------------+-------------------+-----+ 
only showing top 5 rows

ORC 파일 쓰기

df.write.format('orc').mode('overwrite').save('/FileStore/tables/temp/o_file.orc')

SQL 데이터베이스

  • 매우 강력한 커넥터 중 하나
  • SQL을 지원하는 다양한 시스템에 SQL 데이터소스 연결
    • MySQL
    • PostgreSQL
    • Oracle
    • SQLite
  • 데이터 베이스는 원시 파일 형태가 아니므로 고려해야할 옵션이 많음
    • 데이터 베이스 인증 정보나 접속 관련 옵션
    • 스파크 클러스터에서 데이터 베이스 시스템에 접속 가능한지 네트워크 상태 확인

SQL 데이터베이스 읽기

  • 다른 데이터소스처럼 포맷과 옵션을 지정한 후 데이터를 읽어들임
driver='org.sqlite.JDBC'
s_path='dbfs:/FileStore/tables/my_sqlite.db'
url= 'jdbc:sqlite:'+s_path
tablename='flight_info'
%fs ls /FileStore/tables
pathnamesize
dbfs:/FileStore/tables/2010-summary.orc/2010-summary.orc/0
dbfs:/FileStore/tables/2010-summary.parquet/2010-summary.parquet/0
dbfs:/FileStore/tables/2010_summary.csv2010_summary.csv7121
dbfs:/FileStore/tables/2010_summary.json2010_summary.json21353
dbfs:/FileStore/tables/all/all/0
dbfs:/FileStore/tables/my_sqlite.dbmy_sqlite.db11264
dbfs:/FileStore/tables/my_sqlite_copy.dbmy_sqlite_copy.db11264
dbfs:/FileStore/tables/temp/temp/0
#파일 경로 문제 참조
#https://stackoverflow.com/questions/68202341/analysisexception-path-does-not-exist-dbfs-databricks-python-lib-python3-7-si
#https://docs.databricks.com/dev-tools/databricks-utils.html
copy_path='/FileStore/tables/my_sqlite_copy.db'
new_path= '/tmp/my_sqlite_copy.db'
dbutils.fs.cp(copy_path, new_path)
%fs ls /tmp
pathnamesize
dbfs:/tmp/hive/hive/0
dbfs:/tmp/my_sqlite_copy.dbmy_sqlite_copy.db11264
url= 'jdbc:sqlite:'+new_path
url
Out[8]: 'jdbc:sqlite:/tmp/my_sqlite_copy.db'
dbDF = spark.read.format('jdbc').option('url', url).option('dbtable',tablename).option('driver', driver).load()
  • 그냥 이렇게하고 일반 데이터프레임처럼 쓰면 됨
    • 근데 자꾸 에러가...

쿼리푸시다운

  • 스파크는 DataFrame을 만들기 전에 DB자체에서 데이터를 필터링하도록 만들 수 있음
dbDF.filter("DEST_COUNTRY_NAME in ('Anguilla', 'Sweden')")
  • 위 처럼 필터를 명시하면 스파크는 해당 필터에 대한 처리를 DB에 위임한다.
  • 위임하는걸 push down이라고 함
pushdownQuery="(select distinct(dest_country_name) from flight_info) as flight_info"
dbDF = spark.read.format('jdbc').option('url', url).option('dbtable',pushdownQuery).option('driver', driver).load()
  • 또 위처럼 전체 쿼리를 DB에 직접 전달해서 DataFrame으로 결과를 받아야하는 경우엔 테이블명 대신 SQL 쿼리를 명시하면 됨

데이터베이스 병렬로 읽기

  • 스파크는 파일 크기, 파일 유형, 압축 방식에 따른 '분할 가능성'에 따라

    • 여러 파일을 읽어 하나의 파티션으로 만들거나
    • 여러 파티션을 하나의 파일로 만드는 알고리즘을 가짐
  • 파일이 가진 이런 유연성은 SQL 데이터베이스에도 존재하지만 몇 가지 수동 설정이 필요

    • 옵션 목록 중 numPartitions 옵션으로 읽기 및 쓰기용 동시 작업 수를 제한할 수 있는 최대 파티션 수 설정 가능
dbDF = spark.read.format('jdbc').option('url', url).option('dbtable',tablename).option('driver', driver)\
.option('numPartitions',10).load()  

슬라이딩 윈도우 기반의 파티셔닝

  • 조건절을 기반으로 분할할 수 있는 방법
props ={'driver':'org.sqlite.JDBC'}
#분할 기준 컬럼
colName= 'count' 
#처음과 마지막 파티션 사이의 최솟값과 최댓값 (이 범위 밖의 모든 값은 첫 번째 또는 마지막 파티션에 속함)
lowerBound=0
upperBound=348113
#파티션 수
numPartitions=10  
spark.read.jdbc(url, tablename, column=colName, properties=props, lowerBound=lowerBound, upperBound=upperBound,numPartitions=numPartitions )

SQL 데이터베이스 쓰기

  • URI를 지정하고 지정한 쓰기 모드에 따라 데이터를 쓰면 됨
newPath='jdbc:sqlite://tmp/new_qlite.db'
df.write.jdbc(newPath, tablename, properties=props )  

텍스트 파일

  • 파일의 각 줄은 DataFrame의 레코드

텍스트 파일 읽기

spark.read.format('text').load('/FileStore/tables/2010_summary.csv').selectExpr("split(value,',') as rows").show(5)  
+--------------------+ 
rows| 
+--------------------+ 
[DEST_COUNTRY_NAM...| 
[United States, R...| 
[United States, I...| 
[United States, I...| 
[Egypt, United St...| 
+--------------------+ 
only showing top 5 rows

텍스트 파일 쓰기

df.select('StockCode').write.text('/FileStore/tables/tmp.txt')
%fs ls /FileStore/tables  
pathnamesize
dbfs:/FileStore/tables/2010-summary.orc/2010-summary.orc/0
dbfs:/FileStore/tables/2010-summary.parquet/2010-summary.parquet/0
dbfs:/FileStore/tables/2010_summary.csv2010_summary.csv7121
dbfs:/FileStore/tables/2010_summary.json2010_summary.json21353
dbfs:/FileStore/tables/all/all/0
dbfs:/FileStore/tables/my_sqlite.dbmy_sqlite.db11264
dbfs:/FileStore/tables/my_sqlite_copy.dbmy_sqlite_copy.db11264
dbfs:/FileStore/tables/temp/temp/0
dbfs:/FileStore/tables/tmp.txt/tmp.txt/0

고급 I/O개념

  • 쓰기 작업 전에 파티션 수를 조절함으로써 병렬로 처리할 파일 수를 제어할 수 있다.
  • 또한 버켓팅과 파티셔닝을 조절함으로써 데이터의 저장 구조를 제어할 수 있다.

분할 가능한 파일 타입과 압축 방식

  • 기본적으로 분할을 지원하는 특정 포맷은 전체 파일이 아닌 쿼리에 필요한 부분만 읽을 수 있으므로 성능 향상에 도움이 됨
    • HDFS 같은 시스템을 사용한다면 분할된 파일을 여러 블록으로 나누어 분산 저장하므로 더 최적화 가능
  • 압축 방식도 관리해야하는데, 모든 압축 방식이 분할 압축을 지원하진 않음
  • 추천 파일 포맷: 파케이
  • 추천 압축 방식: GZIP

병렬로 데이터 읽기

  • 여러 익스큐터가 같은 파일을 동시에 읽을 순 없지만 여러 파일을 동시에 읽을 순 있음
  • 다수의 파일이 존재하는 폴더를 읽을땐 폴더의 개별 파일은 DataFrame의 파티션이된다.
  • 따라서 사용 가능한 익스큐터를 이용해 병렬로 파일을 읽음
    • 익스큐터 수를 넘어가는 파일은 처리 중인 파일이 완료될 때까지 대기

병렬로 데이터 쓰기

  • 파일이나 데이터 수는 데이터를 쓰는 시점에 DataFrame이 가진 파티션 수에 따라 달라질 수 있음
  • 기본적으로 데이터 파티션당 하나의 파일이 작성
  • 옵션에 지정된 파일명은 실제로는 다수의 파일을 가진 디렉터리
#폴더 안에 5개의 파일을 생성함
df.repartition(5).write.format('csv').save('/tmp/multiple.csv')  
%fs ls /tmp/multiple.csv  
pathnamesize
dbfs:/tmp/multiple.csv/_SUCCESS_SUCCESS0
dbfs:/tmp/multiple.csv/_committed_7308919149863971029_committed_7308919149863971029463
dbfs:/tmp/multiple.csv/_started_7308919149863971029_started_73089191498639710290
dbfs:/tmp/multiple.csv/part-00000-tid-7308919149863971029-29eda532-ce72-4f1b-83a7-f0340c44f34f-9-1-c000.csvpart-00000-tid-7308919149863971029-29eda532-ce72-4f1b-83a7-f0340c44f34f-9-1-c000.csv9040894
dbfs:/tmp/multiple.csv/part-00001-tid-7308919149863971029-29eda532-ce72-4f1b-83a7-f0340c44f34f-10-1-c000.csvpart-00001-tid-7308919149863971029-29eda532-ce72-4f1b-83a7-f0340c44f34f-10-1-c000.csv9046349
dbfs:/tmp/multiple.csv/part-00002-tid-7308919149863971029-29eda532-ce72-4f1b-83a7-f0340c44f34f-11-1-c000.csvpart-00002-tid-7308919149863971029-29eda532-ce72-4f1b-83a7-f0340c44f34f-11-1-c000.csv9038812
dbfs:/tmp/multiple.csv/part-00003-tid-7308919149863971029-29eda532-ce72-4f1b-83a7-f0340c44f34f-13-1-c000.csvpart-00003-tid-7308919149863971029-29eda532-ce72-4f1b-83a7-f0340c44f34f-13-1-c000.csv9036785
dbfs:/tmp/multiple.csv/part-00004-tid-7308919149863971029-29eda532-ce72-4f1b-83a7-f0340c44f34f-12-1-c000.csvpart-00004-tid-7308919149863971029-29eda532-ce72-4f1b-83a7-f0340c44f34f-12-1-c000.csv9041847

파티셔닝

  • 어떤 데이터를 어디에 저장할 것인지 제어할 수 있는 기능
  • 디렉터리별로 컬럼 데이터를 인코딩해서 저장
    • 그래서 저장 후 읽을 때 전체 데이터셋을 스캔하지 않고 필요한 컬럼의 데이터만 읽기 가능
  • 이 방식은 모든 파일 기반의 데이터소스에서 지원
  • 파티셔닝은 필터링을 자주 사용하는 테이블을 가진 경우에 사용할 수 있는 가장 손쉬운 최적화 방식
#InvoiceNo값 기준으로 파티셔닝
df.limit(10).write.mode('overwrite').partitionBy('InvoiceNo').save('/tmp/partitioned-files.parquet')  
display(df.limit(10))  
InvoiceNoStockCodeDescriptionQuantityInvoiceDateUnitPriceCustomerIDCountry
53636585123AWHITE HANGING HEART T-LIGHT HOLDER612/1/2010 8:262.5517850United Kingdom
53636571053WHITE METAL LANTERN612/1/2010 8:263.3917850United Kingdom
53636584406BCREAM CUPID HEARTS COAT HANGER812/1/20108:262.7517850
53636584029GKNITTED UNION FLAG HOT WATER BOTTLE612/1/20108:263.3917850
53636584029ERED WOOLLY HOTTIE WHITE HEART.612/1/20108:263.3917850
53636522752SET 7 BABUSHKA NESTING BOXES212/1/20108:267.6517850
53636521730GLASS STAR FROSTED T-LIGHT HOLDER612/1/20108:264.2517850
53636622633HAND WARMER UNION JACK612/1/20108:281.8517850
53636622632HAND WARMER RED POLKA DOT612/1/20108:281.8517850
53636784879ASSORTED COLOUR BIRD ORNAMENT3212/1/20108:341.6913047
%fs ls /tmp/partitioned-files.parquet  
pathnamesize
dbfs:/tmp/partitioned-files.parquet/InvoiceNo=536365/InvoiceNo=536365/0
dbfs:/tmp/partitioned-files.parquet/InvoiceNo=536366/InvoiceNo=536366/0
dbfs:/tmp/partitioned-files.parquet/InvoiceNo=536367/InvoiceNo=536367/0
dbfs:/tmp/partitioned-files.parquet/_delta_log/_delta_log/0
  • 각 폴더는 조건절을 폴더명으로 사용하며, 조건절을 만족하는 데이터가 저장된 파케이 파일을 가지고 있음

버켓팅

  • 각 파일에 저장된 데이터를 제어할 수 있는 파일 조직화 기법
  • 동일한 버킷 ID를 가진 데이터가 하나의 물리적 파티션에 모여 있으므로 데이터를 읽을 때 셔플을 피할 수 있음
    • 사전에 파티셔닝된 것이므로 조인이나 집계 시 발생하는 고비용의 셔플을 피할 수 있음
  • 높은 카디널리티(유니크 값이 많은)를 가지는 컬럼은 파티셔닝을 하면 수억 개의 디렉터리가 생성될 수도 있다.
    • 이때 버켓 단위로 데이터를 모아 일정 수의 파일로 저장하는 것이 효율적
df.select(F.countDistinct('InvoiceNo')).collect()
Out[16]: [Row(count(DISTINCT InvoiceNo)=25900)]
  • 위 컬럼 기준으로 파티셔닝하면 25900개의 디렉터리가 생성될 것임
    • 아까는 limit(10)해서 3개밖에 생성되지 않은 것이고
#버켓단위로 데이터를 모아 일정 수의 파일로 저장하기
bucketNum = 10
bucketCol= 'InvoiceNo'

#기본적으로 아래 디렉터리 하위에 버켓팅 파일을 기록하므로 먼저 해당 디렉터리 생성
dbutils.fs.mkdirs('/user/hive/warehouse')
Out[9]: True
df.write.format('parquet').bucketBy(bucketNum, bucketCol).saveAsTable('bucketedFiles')
%fs ls /user/hive/warehouse/bucketedfiles/
pathnamesize
dbfs:/user/hive/warehouse/bucketedfiles/_SUCCESS_SUCCESS0
dbfs:/user/hive/warehouse/bucketedfiles/_committed_1429916160167243299_committed_14299161601672432998432
dbfs:/user/hive/warehouse/bucketedfiles/_started_1429916160167243299_started_14299161601672432990
dbfs:/user/hive/warehouse/bucketedfiles/part-00000-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-27-10_00009.c000.snappy.parquetpart-00000-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-27-10_00009.c000.snappy.parquet90262
dbfs:/user/hive/warehouse/bucketedfiles/part-00000-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-27-1_00000.c000.snappy.parquetpart-00000-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-27-1_00000.c000.snappy.parquet87741
dbfs:/user/hive/warehouse/bucketedfiles/part-00000-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-27-2_00001.c000.snappy.parquetpart-00000-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-27-2_00001.c000.snappy.parquet74086
dbfs:/user/hive/warehouse/bucketedfiles/part-00000-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-27-3_00002.c000.snappy.parquetpart-00000-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-27-3_00002.c000.snappy.parquet84847
dbfs:/user/hive/warehouse/bucketedfiles/part-00000-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-27-4_00003.c000.snappy.parquetpart-00000-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-27-4_00003.c000.snappy.parquet92241
dbfs:/user/hive/warehouse/bucketedfiles/part-00000-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-27-5_00004.c000.snappy.parquetpart-00000-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-27-5_00004.c000.snappy.parquet89909
dbfs:/user/hive/warehouse/bucketedfiles/part-00000-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-27-6_00005.c000.snappy.parquetpart-00000-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-27-6_00005.c000.snappy.parquet84077
dbfs:/user/hive/warehouse/bucketedfiles/part-00000-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-27-7_00006.c000.snappy.parquetpart-00000-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-27-7_00006.c000.snappy.parquet87207
dbfs:/user/hive/warehouse/bucketedfiles/part-00000-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-27-8_00007.c000.snappy.parquetpart-00000-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-27-8_00007.c000.snappy.parquet92634
dbfs:/user/hive/warehouse/bucketedfiles/part-00000-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-27-9_00008.c000.snappy.parquetpart-00000-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-27-9_00008.c000.snappy.parquet82842
dbfs:/user/hive/warehouse/bucketedfiles/part-00001-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-28-10_00009.c000.snappy.parquetpart-00001-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-28-10_00009.c000.snappy.parquet85100
dbfs:/user/hive/warehouse/bucketedfiles/part-00001-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-28-1_00000.c000.snappy.parquetpart-00001-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-28-1_00000.c000.snappy.parquet81427
dbfs:/user/hive/warehouse/bucketedfiles/part-00001-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-28-2_00001.c000.snappy.parquetpart-00001-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-28-2_00001.c000.snappy.parquet91127
dbfs:/user/hive/warehouse/bucketedfiles/part-00001-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-28-3_00002.c000.snappy.parquetpart-00001-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-28-3_00002.c000.snappy.parquet86022
dbfs:/user/hive/warehouse/bucketedfiles/part-00001-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-28-4_00003.c000.snappy.parquetpart-00001-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-28-4_00003.c000.snappy.parquet79613
dbfs:/user/hive/warehouse/bucketedfiles/part-00001-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-28-5_00004.c000.snappy.parquetpart-00001-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-28-5_00004.c000.snappy.parquet81113
dbfs:/user/hive/warehouse/bucketedfiles/part-00001-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-28-6_00005.c000.snappy.parquetpart-00001-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-28-6_00005.c000.snappy.parquet90673
dbfs:/user/hive/warehouse/bucketedfiles/part-00001-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-28-7_00006.c000.snappy.parquetpart-00001-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-28-7_00006.c000.snappy.parquet80229
dbfs:/user/hive/warehouse/bucketedfiles/part-00001-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-28-8_00007.c000.snappy.parquetpart-00001-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-28-8_00007.c000.snappy.parquet83282
dbfs:/user/hive/warehouse/bucketedfiles/part-00001-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-28-9_00008.c000.snappy.parquetpart-00001-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-28-9_00008.c000.snappy.parquet93196
dbfs:/user/hive/warehouse/bucketedfiles/part-00002-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-29-10_00009.c000.snappy.parquetpart-00002-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-29-10_00009.c000.snappy.parquet93511
dbfs:/user/hive/warehouse/bucketedfiles/part-00002-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-29-1_00000.c000.snappy.parquetpart-00002-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-29-1_00000.c000.snappy.parquet94358
dbfs:/user/hive/warehouse/bucketedfiles/part-00002-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-29-2_00001.c000.snappy.parquetpart-00002-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-29-2_00001.c000.snappy.parquet84961
dbfs:/user/hive/warehouse/bucketedfiles/part-00002-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-29-3_00002.c000.snappy.parquetpart-00002-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-29-3_00002.c000.snappy.parquet80911
dbfs:/user/hive/warehouse/bucketedfiles/part-00002-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-29-4_00003.c000.snappy.parquetpart-00002-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-29-4_00003.c000.snappy.parquet91751
dbfs:/user/hive/warehouse/bucketedfiles/part-00002-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-29-5_00004.c000.snappy.parquetpart-00002-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-29-5_00004.c000.snappy.parquet78403
dbfs:/user/hive/warehouse/bucketedfiles/part-00002-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-29-6_00005.c000.snappy.parquetpart-00002-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-29-6_00005.c000.snappy.parquet82548
dbfs:/user/hive/warehouse/bucketedfiles/part-00002-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-29-7_00006.c000.snappy.parquetpart-00002-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-29-7_00006.c000.snappy.parquet82517
dbfs:/user/hive/warehouse/bucketedfiles/part-00002-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-29-8_00007.c000.snappy.parquetpart-00002-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-29-8_00007.c000.snappy.parquet82756
dbfs:/user/hive/warehouse/bucketedfiles/part-00002-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-29-9_00008.c000.snappy.parquetpart-00002-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-29-9_00008.c000.snappy.parquet89442
dbfs:/user/hive/warehouse/bucketedfiles/part-00003-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-30-10_00009.c000.snappy.parquetpart-00003-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-30-10_00009.c000.snappy.parquet93217
dbfs:/user/hive/warehouse/bucketedfiles/part-00003-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-30-1_00000.c000.snappy.parquetpart-00003-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-30-1_00000.c000.snappy.parquet83924
dbfs:/user/hive/warehouse/bucketedfiles/part-00003-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-30-2_00001.c000.snappy.parquetpart-00003-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-30-2_00001.c000.snappy.parquet94888
dbfs:/user/hive/warehouse/bucketedfiles/part-00003-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-30-3_00002.c000.snappy.parquetpart-00003-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-30-3_00002.c000.snappy.parquet81224
dbfs:/user/hive/warehouse/bucketedfiles/part-00003-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-30-4_00003.c000.snappy.parquetpart-00003-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-30-4_00003.c000.snappy.parquet81094
dbfs:/user/hive/warehouse/bucketedfiles/part-00003-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-30-5_00004.c000.snappy.parquetpart-00003-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-30-5_00004.c000.snappy.parquet81804
dbfs:/user/hive/warehouse/bucketedfiles/part-00003-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-30-6_00005.c000.snappy.parquetpart-00003-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-30-6_00005.c000.snappy.parquet88050
dbfs:/user/hive/warehouse/bucketedfiles/part-00003-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-30-7_00006.c000.snappy.parquetpart-00003-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-30-7_00006.c000.snappy.parquet86349
dbfs:/user/hive/warehouse/bucketedfiles/part-00003-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-30-8_00007.c000.snappy.parquetpart-00003-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-30-8_00007.c000.snappy.parquet88488
dbfs:/user/hive/warehouse/bucketedfiles/part-00003-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-30-9_00008.c000.snappy.parquetpart-00003-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-30-9_00008.c000.snappy.parquet87608
dbfs:/user/hive/warehouse/bucketedfiles/part-00004-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-31-10_00009.c000.snappy.parquetpart-00004-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-31-10_00009.c000.snappy.parquet87329
dbfs:/user/hive/warehouse/bucketedfiles/part-00004-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-31-1_00000.c000.snappy.parquetpart-00004-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-31-1_00000.c000.snappy.parquet88483
dbfs:/user/hive/warehouse/bucketedfiles/part-00004-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-31-2_00001.c000.snappy.parquetpart-00004-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-31-2_00001.c000.snappy.parquet81433
dbfs:/user/hive/warehouse/bucketedfiles/part-00004-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-31-3_00002.c000.snappy.parquetpart-00004-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-31-3_00002.c000.snappy.parquet80855
dbfs:/user/hive/warehouse/bucketedfiles/part-00004-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-31-4_00003.c000.snappy.parquetpart-00004-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-31-4_00003.c000.snappy.parquet86472
dbfs:/user/hive/warehouse/bucketedfiles/part-00004-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-31-5_00004.c000.snappy.parquetpart-00004-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-31-5_00004.c000.snappy.parquet87299
dbfs:/user/hive/warehouse/bucketedfiles/part-00004-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-31-6_00005.c000.snappy.parquetpart-00004-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-31-6_00005.c000.snappy.parquet85073
dbfs:/user/hive/warehouse/bucketedfiles/part-00004-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-31-7_00006.c000.snappy.parquetpart-00004-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-31-7_00006.c000.snappy.parquet85654
dbfs:/user/hive/warehouse/bucketedfiles/part-00004-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-31-8_00007.c000.snappy.parquetpart-00004-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-31-8_00007.c000.snappy.parquet81005
dbfs:/user/hive/warehouse/bucketedfiles/part-00004-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-31-9_00008.c000.snappy.parquetpart-00004-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-31-9_00008.c000.snappy.parquet90273
dbfs:/user/hive/warehouse/bucketedfiles/part-00005-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-32-10_00009.c000.snappy.parquetpart-00005-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-32-10_00009.c000.snappy.parquet77355
dbfs:/user/hive/warehouse/bucketedfiles/part-00005-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-32-1_00000.c000.snappy.parquetpart-00005-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-32-1_00000.c000.snappy.parquet81979
dbfs:/user/hive/warehouse/bucketedfiles/part-00005-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-32-2_00001.c000.snappy.parquetpart-00005-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-32-2_00001.c000.snappy.parquet80641
dbfs:/user/hive/warehouse/bucketedfiles/part-00005-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-32-3_00002.c000.snappy.parquetpart-00005-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-32-3_00002.c000.snappy.parquet81541
dbfs:/user/hive/warehouse/bucketedfiles/part-00005-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-32-4_00003.c000.snappy.parquetpart-00005-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-32-4_00003.c000.snappy.parquet95708
dbfs:/user/hive/warehouse/bucketedfiles/part-00005-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-32-5_00004.c000.snappy.parquetpart-00005-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-32-5_00004.c000.snappy.parquet91008
dbfs:/user/hive/warehouse/bucketedfiles/part-00005-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-32-6_00005.c000.snappy.parquetpart-00005-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-32-6_00005.c000.snappy.parquet81946
dbfs:/user/hive/warehouse/bucketedfiles/part-00005-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-32-7_00006.c000.snappy.parquetpart-00005-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-32-7_00006.c000.snappy.parquet87397
dbfs:/user/hive/warehouse/bucketedfiles/part-00005-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-32-8_00007.c000.snappy.parquetpart-00005-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-32-8_00007.c000.snappy.parquet84939
dbfs:/user/hive/warehouse/bucketedfiles/part-00005-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-32-9_00008.c000.snappy.parquetpart-00005-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-32-9_00008.c000.snappy.parquet80757
dbfs:/user/hive/warehouse/bucketedfiles/part-00006-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-33-10_00009.c000.snappy.parquetpart-00006-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-33-10_00009.c000.snappy.parquet86184
dbfs:/user/hive/warehouse/bucketedfiles/part-00006-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-33-1_00000.c000.snappy.parquetpart-00006-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-33-1_00000.c000.snappy.parquet89709
dbfs:/user/hive/warehouse/bucketedfiles/part-00006-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-33-2_00001.c000.snappy.parquetpart-00006-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-33-2_00001.c000.snappy.parquet88274
dbfs:/user/hive/warehouse/bucketedfiles/part-00006-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-33-3_00002.c000.snappy.parquetpart-00006-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-33-3_00002.c000.snappy.parquet76828
dbfs:/user/hive/warehouse/bucketedfiles/part-00006-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-33-4_00003.c000.snappy.parquetpart-00006-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-33-4_00003.c000.snappy.parquet63636
dbfs:/user/hive/warehouse/bucketedfiles/part-00006-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-33-5_00004.c000.snappy.parquetpart-00006-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-33-5_00004.c000.snappy.parquet91554
dbfs:/user/hive/warehouse/bucketedfiles/part-00006-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-33-6_00005.c000.snappy.parquetpart-00006-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-33-6_00005.c000.snappy.parquet84641
dbfs:/user/hive/warehouse/bucketedfiles/part-00006-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-33-7_00006.c000.snappy.parquetpart-00006-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-33-7_00006.c000.snappy.parquet79675
dbfs:/user/hive/warehouse/bucketedfiles/part-00006-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-33-8_00007.c000.snappy.parquetpart-00006-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-33-8_00007.c000.snappy.parquet86432
dbfs:/user/hive/warehouse/bucketedfiles/part-00006-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-33-9_00008.c000.snappy.parquetpart-00006-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-33-9_00008.c000.snappy.parquet79475
dbfs:/user/hive/warehouse/bucketedfiles/part-00007-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-34-10_00009.c000.snappy.parquetpart-00007-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-34-10_00009.c000.snappy.parquet39512
dbfs:/user/hive/warehouse/bucketedfiles/part-00007-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-34-1_00000.c000.snappy.parquetpart-00007-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-34-1_00000.c000.snappy.parquet51921
dbfs:/user/hive/warehouse/bucketedfiles/part-00007-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-34-2_00001.c000.snappy.parquetpart-00007-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-34-2_00001.c000.snappy.parquet47941
dbfs:/user/hive/warehouse/bucketedfiles/part-00007-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-34-3_00002.c000.snappy.parquetpart-00007-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-34-3_00002.c000.snappy.parquet33996
dbfs:/user/hive/warehouse/bucketedfiles/part-00007-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-34-4_00003.c000.snappy.parquetpart-00007-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-34-4_00003.c000.snappy.parquet38650
dbfs:/user/hive/warehouse/bucketedfiles/part-00007-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-34-5_00004.c000.snappy.parquetpart-00007-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-34-5_00004.c000.snappy.parquet49519
dbfs:/user/hive/warehouse/bucketedfiles/part-00007-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-34-6_00005.c000.snappy.parquetpart-00007-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-34-6_00005.c000.snappy.parquet33252
dbfs:/user/hive/warehouse/bucketedfiles/part-00007-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-34-7_00006.c000.snappy.parquetpart-00007-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-34-7_00006.c000.snappy.parquet36333
dbfs:/user/hive/warehouse/bucketedfiles/part-00007-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-34-8_00007.c000.snappy.parquetpart-00007-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-34-8_00007.c000.snappy.parquet28534
dbfs:/user/hive/warehouse/bucketedfiles/part-00007-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-34-9_00008.c000.snappy.parquetpart-00007-tid-1429916160167243299-ae8dd407-c390-4806-8bb9-1eed6d0e2e7f-34-9_00008.c000.snappy.parquet42641

복합 데이터 유형 쓰기

  • csv파일은 복합 데이터 타입을 지원하지 않음
  • 파케이, ORC는 복합 데이터 타입 지원

파일 크기 관리

  • 데이터를 저장할 땐 파일 크기가 중요한 요소가 아니지만 읽을 땐 중요한 요소 중 하나

  • 작은 크기의 파일 문제

    • 작은 파일을 많이 생성하면 메타데이터에 엄청난 관리 부하가 발생
    • HDFS 등 많은 파일 시스템은 작은 크기의 파일을 잘 다루지 못함
    • 스파크는 특히 더 못다룸
  • 큰 크기의 파일 문제

    • 몇 개의 로우가 필요하더라도 전체 데이터 블록을 읽어야하므로 비효율적
  • 스파크 2.2버전에는 파일 크기를 제어할 수 있는 새로운 방법이 도입됨

    • maxRecordsPerFile옵션에 파일당 레코드 수를 지정하여 파일 크기를 효과적으로 제어 가능
#파일당 최대 5000개의 로우를 포함하도록 보장
df.write.option('maxRecordsPerFile',5000)
Out[17]: <pyspark.sql.readwriter.DataFrameWriter at 0x7fcf15185eb0>
profile
Data Engineer

0개의 댓글