2017-11-08 4 views
2

Avro 파일로 저장된 데이터가있는 some_field (int 유형의) 하이브 테이블로 파티션 된 경우 데이터 프레임이 반환 된 방식으로 Spark SQL을 사용하여 테이블을 쿼리하려고합니다. some_field (파티셔닝에 사용됨). 단지Spark SQL 파티션 인식 하이브 테이블 쿼리

SELECT * FROM some_table 

기본 불꽃으로 그렇게하지 않는 것처럼

쿼리 보인다 없음 data_frame.rdd.partitioner입니다 돌아왔다.

결과를 얻는 한 가지 방법은 쿼리 후 명시 적으로 다시 분할하는 것입니다.하지만 더 나은 해결책이 될 수 있습니다.

HDP 2.6, 스파크 2

고마워.

+0

당신이 말하는 하이브 파티션과 하이브리드 파티션은 두 가지가 있다고 생각합니다. 둘 다 완전히 독립적이라고 생각합니다. rdd/dataset 파티셔닝에 대해 읽으려면 [line] (https://stackoverflow.com/questions/44222307/spark-rdd-default-number-of-partitions)을 따르십시오. –

+0

물론 독립 실행 형이지만 실행 엔진이 기본 저장소 분할을 사용할 수 없을 때까지 후자는 쓸모가 없습니다. 링크 주셔서 감사합니다. –

답변

3

먼저 Dataset의 파티션과 RDD[Row]의 파티션을 구별해야합니다. 상관없이 전 하나의 실행 계획이 무엇인지, 후자는이 Partitioner이 없다되지 않습니다

scala> val df = spark.range(100).repartition(10, $"id") 
df: org.apache.spark.sql.Dataset[Long] = [id: bigint] 

scala> df.rdd.partitioner 
res1: Option[org.apache.spark.Partitioner] = None 

RDD 그러나 내부 가질 수있는 Partitioner :

scala> df.queryExecution.toRdd.partitioner 
res2: Option[org.apache.spark.Partitioner] = Some([email protected]) 

이 그러나 않을 수 있습니다 (Spark 2.2) 현재 데이터 소스 API는 물리적 저장소 정보를 인식하지 못하기 때문에 (단순 파티션 정리 제외) 여기에서 도움을 받으십시오. 이는 곧 출시 될 데이터 소스 API에서 변경되어야합니다. 자세한 내용은 JIRA ticket (SPARK-15689)design document을 참조하십시오.