2017-01-17 1 views
5

저는 스파크가 마루에서 통계 (최소/최대)를 저장하는 방법과 쿼리 최적화를 위해 정보를 사용하는 방법을 조사했습니다. 몇 가지 질문이 있습니다. 첫 번째 설정 : Spark 2.1.0, 다음은 긴 유형 및 문자열 유형 열이있는 1000 행의 데이터 프레임을 설정합니다. 다른 열로 정렬됩니다. 그래서 질문은 왜 스파크, 특히, 2.1.0 만 생성되는 분입니다스파크 마루 통계 (최소/최대) 통합

hadoop jar parquet-tools-1.9.1-SNAPSHOT.jar meta /secret/spark21-sortById/part-00000-39f7ac12-6038-46ee-b5c3-d7a5a06e4425.snappy.parquet 
file:  file:/secret/spark21-sortById/part-00000-39f7ac12-6038-46ee-b5c3-d7a5a06e4425.snappy.parquet 
creator:  parquet-mr version 1.8.1 (build 4aba4dae7bb0d4edbcf7923ae1339f28fd3f7fcf) 
extra:  org.apache.spark.sql.parquet.row.metadata = {"type":"struct","fields":[{"name":"id","type":"long","nullable":false,"metadata":{}},{"name":"text","type":"string","nullable":false,"metadata":{}}]} 

file schema: spark_schema 
-------------------------------------------------------------------------------- 
id:   REQUIRED INT64 R:0 D:0 
text:  REQUIRED BINARY O:UTF8 R:0 D:0 

row group 1: RC:5 TS:133 OFFSET:4 
-------------------------------------------------------------------------------- 
id:   INT64 SNAPPY DO:0 FPO:4 SZ:71/81/1.14 VC:5 ENC:PLAIN,BIT_PACKED STA:[min: 0, max: 4, num_nulls: 0] 
text:   BINARY SNAPPY DO:0 FPO:75 SZ:53/52/0.98 VC:5 ENC:PLAIN,BIT_PACKED 

hadoop jar parquet-tools-1.9.1-SNAPSHOT.jar meta /secret/spark21-sortByText/part-00000-3d7eac74-5ca0-44a0-b8a6-d67cc38a2bde.snappy.parquet 
file:  file:/secret/spark21-sortByText/part-00000-3d7eac74-5ca0-44a0-b8a6-d67cc38a2bde.snappy.parquet 
creator:  parquet-mr version 1.8.1 (build 4aba4dae7bb0d4edbcf7923ae1339f28fd3f7fcf) 
extra:  org.apache.spark.sql.parquet.row.metadata = {"type":"struct","fields":[{"name":"id","type":"long","nullable":false,"metadata":{}},{"name":"text","type":"string","nullable":false,"metadata":{}}]} 

file schema: spark_schema 
-------------------------------------------------------------------------------- 
id:   REQUIRED INT64 R:0 D:0 
text:  REQUIRED BINARY O:UTF8 R:0 D:0 

row group 1: RC:5 TS:140 OFFSET:4 
-------------------------------------------------------------------------------- 
id:   INT64 SNAPPY DO:0 FPO:4 SZ:71/81/1.14 VC:5 ENC:PLAIN,BIT_PACKED STA:[min: 0, max: 101, num_nulls: 0] 
text:   BINARY SNAPPY DO:0 FPO:75 SZ:60/59/0.98 VC:5 ENC:PLAIN,BIT_PACKED 

:

scala> spark.sql("select id, cast(id as string) text from range(1000)").sort("id").write.parquet("/secret/spark21-sortById") 
scala> spark.sql("select id, cast(id as string) text from range(1000)").sort("Text").write.parquet("/secret/spark21-sortByText") 

나는 통계를 인쇄하여 생성 된 마루 파일을 검사하는 마루 - 도구 몇 가지 코드를 추가/문자열 필드가 정렬에 포함되어 있더라도 숫자 열은 최대 (문자열 (BINARY) 필드는 제외)? 어쩌면 구성을 놓친 것일까 요?

두 번째 문제는 스파크가 최소/최대를 활용하고 있음을 어떻게 확인할 수 있습니까?

scala> sc.setLogLevel("INFO") 
scala> spark.sql("select * from parquet.`/secret/spark21-sortById` where id=4").show 

나는이 같은 많은 라인을 가지고 :

17/01/17 09:23:35 INFO FilterCompat: Filtering using predicate: and(noteq(id, null), eq(id, 4)) 
17/01/17 09:23:35 INFO FileScanRDD: Reading File path: file:///secret/spark21-sortById/part-00000-39f7ac12-6038-46ee-b5c3-d7a5a06e4425.snappy.parquet, range: 0-558, partition values: [empty row] 
... 
17/01/17 09:23:35 INFO FilterCompat: Filtering using predicate: and(noteq(id, null), eq(id, 4)) 
17/01/17 09:23:35 INFO FileScanRDD: Reading File path: file:///secret/spark21-sortById/part-00193-39f7ac12-6038-46ee-b5c3-d7a5a06e4425.snappy.parquet, range: 0-574, partition values: [empty row] 
... 

질문 최소/최대에서, 스파크는 파트 -를 결정할 수 있어야한다해도 스파크가 모든 파일을 검색하는 것처럼 보이는 것입니다 00000에는 관련 데이터가 있습니다. 아니면 내가 잘못 읽은 것일까? 스파크가 그 파일들을 건너 뛰고 있다는거야? 어쩌면 스파크는 데이터 건너 뛰기를 위해서만 파티션 값을 사용할 수 있습니까?

답변

0

첫 번째 질문은 이것이 정의의 문제라고 생각합니다. (문자열의 최소/최대는 어휘 순서입니까?) 어떤 경우에는 내가 아는 바로는 스파크의 마루는 현재 숫자를 색인합니다.

두 번째 질문에 관해서는, 당신이 더 깊게 보면 불꽃이 파일 자체를로드하지 않는다는 것을 알 것입니다. 대신 메타 데이터를 읽으므로 블록을 읽을 지 여부를 알 수 있습니다. 그래서 기본적으로 그것은 술어를 파일 (블록) 수준으로 밀어 넣고 있습니다.

0

PARQUET-686은 적절하다고 생각되면 의도적으로 이진 필드의 통계를 무시하도록 변경했습니다. parquet.strings.signed-min-max.enabledtrue으로 설정하여이 동작을 무시할 수 있습니다.

설정을 완료 한 후, parquet-tools를 사용하여 2 진수 필드에서 min/max를 읽을 수 있습니다.

자세한 내용은 my another stackoverflow question

관련 문제